在线等,条件查询取反

ojwftded 2011-09-15 10:17:29
现在碰到一个比较复杂的复合查询条件,两种情况,分别用到查询和取反查询,想直接进行取反操作
但是不加条件进行查询,查询结果集为25个,正常查询,结果为4个,取反查询结果为16个,从网上查了下,可能是由于查询中有有的查询结果为Null值,取反仍为Null,造成查询不到,不知道有什么方法进行取反操作(只要不为True在取反结果中都有)
查询模型基本为
select * from table1 left join table2 on *** where A and (B and (c or d or e))
取反为select * from table1 left join table2 on *** where not A and (B and (c or d or e))
试验了一下Is Null,不过貌似他只对一列起作用,不能应用于条件
...全文
951 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ojwftded 2011-09-15
  • 打赏
  • 举报
回复
难道如果复合查询条件是NULL的话,就不能查询出来了?不会没有解决办法吧
ojwftded 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fredrickhu 的回复:]
给查询语句有什么用??给出测试数据和所需要的结果
[/Quote]
给出sql语句都没有用,给你一堆数据你能看出来什么。
根据语句看下有没有可能正反查询都查不到的条件就够了
--小F-- 2011-09-15
  • 打赏
  • 举报
回复
给查询语句有什么用??给出测试数据和所需要的结果
ojwftded 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ojwftded 的回复:]
SQL code

SELECT * FROM WB_Form_Waiting_List T$_aaf3606a INNER JOIN WB_Form_FilePrint T$_23ac687e ON ((T$_aaf3606a.Form_Type = 'FilePrint') AND (T$_aaf3606a.Form_Guid = T$_23ac687e.GUID))
WHERE ……
[/Quote]
其中 PrintCount RemainCount ValidBeginTime ValidEndTime都允许为空
ojwftded 2011-09-15
  • 打赏
  • 举报
回复

SELECT * FROM WB_Form_Waiting_List T$_aaf3606a INNER JOIN WB_Form_FilePrint T$_23ac687e ON ((T$_aaf3606a.Form_Type = 'FilePrint') AND (T$_aaf3606a.Form_Guid = T$_23ac687e.GUID))
WHERE T$_aaf3606a.Form_Class <> 'Cancel'
AND (T$_23ac687e.Is_Pass <> '0' OR T$_23ac687e.Is_End <> '1')
AND ((T$_23ac687e.ValidEndTime IS NULL AND T$_23ac687e.RemainCount <> '0')
OR (T$_23ac687e.PrintCount = '0'
AND T$_23ac687e.ValidBeginTime < '2011-09-15 09:31:32.169'
AND T$_23ac687e.ValidEndTime > '2011-09-15 09:31:32.169')
OR (T$_23ac687e.PrintCount <> '0'
AND T$_23ac687e.RemainCount <> '0'
AND T$_23ac687e.ValidBeginTime < '2011-09-15 09:31:32.169'
AND T$_23ac687e.ValidEndTime > '2011-09-15 09:31:32.169')
)
)

那看看把,这是差不多的查询条件,我只去掉了数据库名和把列变成了*,其他的查询条件没有动,只做了整理
AcHerat 2011-09-15
  • 打赏
  • 举报
回复
A B C D E 这些条件如果存在NULL不好处理,建议加标识列来区分。


;with ach as
(
select rn=row_number() over (order by getdate()),* from table1 left join table2 on ***
)

select *
from ach
where rn not in (select rn from ach where A and (B and (c or d or e)))
-晴天 2011-09-15
  • 打赏
  • 举报
回复
建议把不反的拿出来看看,再让大家帮你看看反的咋弄,因为我们对你的不反的与NULL的是个什么样的关系,然后才能想出来怎么处理.
ojwftded 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nbdba 的回复:]
可能left join影响的
[/Quote]
记错了,用的是Inner Join。另外,也说不通,不管怎么连接,取反,和不取反相加结果数量应该等于没有查询条件的结果数量,没有可能少啊
ojwftded 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nbdba 的回复:]
加括号后NOT (...) 肯定是...的反,不管...中是否包含IS NULL、IS NOT NULL、<>等。
[/Quote]
因为not (Null)仍然为Null,所以查不到。
我猜的是由于这个问题,造成了加了Not后查询数目不对
NBDBA 2011-09-15
  • 打赏
  • 举报
回复
可能left join影响的
NBDBA 2011-09-15
  • 打赏
  • 举报
回复
那就具体来看吧
NBDBA 2011-09-15
  • 打赏
  • 举报
回复
加括号后NOT (...) 肯定是...的反,不管...中是否包含IS NULL、IS NOT NULL、<>等。
ojwftded 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nbdba 的回复:]
SQL code
select * from table1 left join table2 on *** where not (A and (B and (c or d or e)))
[/Quote]
哦,我写错了,我的语句也确实用括号括上了,就是结果少了。另外补充下,无法使用子查询,因为其中包含打字段,我用的sql server ,无法进行子查询
AcHerat 2011-09-15
  • 打赏
  • 举报
回复
看看数据和对应结果。
NBDBA 2011-09-15
  • 打赏
  • 举报
回复
select * from table1 left join table2 on *** where not (A and (B and (c or d or e)))

ojwftded 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 chuanzhang5687 的回复:]
最好能举个例子
[/Quote]

select * from where true and true and (false or false or null)
ojwftded 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 chuanzhang5687 的回复:]
最好能举个例子
[/Quote]

select * from where true and true and (false or false or null)

这个例子够生动了把,不论取反,还是正常,都查不出来当条件是空的时候的值
chuanzhang5687 2011-09-15
  • 打赏
  • 举报
回复
最好能举个例子

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧