Nen*_*adK 4 sql database oracle
我有一个查询从一个表中检索数据.但是查询使用如下的MINUS
子句:
SELECT field1, field2
FROM tab
WHERE field3 = 'a'
AND field4 = 'b'
MINUS
SELECT field1, field2
FROM tab
WHERE field5 = 'c'
AND field6 = 'd'
Run Code Online (Sandbox Code Playgroud)
由于这是从同一个表中选择,我试图重写这个以摆脱该MINUS
条款.我认为这样的事情应该有效:
SELECT DISTINCT field1, field2
FROM tab
WHERE field3 = 'a'
AND field4 = 'b'
AND NOT (field5 = 'c'
AND field6 = 'd')
Run Code Online (Sandbox Code Playgroud)
我的理由是,如果该MINUS
子句排除了第二个查询中的记录,那么将该WHERE
子句包装在一个AND NOT
应该删除相同的记录.该MINUS
条款也摆脱了重复,这就是我添加DISTINCT
到选择中的原因.然而问题是,我的查询返回多比原来的记录.
我在这里错过了什么?
考虑这两行:
1,2,a,b,x,y
1,2,u,v,c,d
MINUS操作不会返回对(1,2),但您的查询将会.c,d值可能与1,2相同,但与a,b的行不同
根本区别在于MINUS在设定级别运行,而NOT条件一次只能在一行上运行(在其他列中具有"必需"值的同一行).
现在:您可以使您的查询更有效(尽管您无法避免两次读取基表).使用NOT IN条件:
select field1, field2 from tab where field3 = 'a' and field4 = 'b'
and (field1, field2) not in
(select field1, field2 from tab where field5 = 'c' and field6 = 'd');
Run Code Online (Sandbox Code Playgroud)
注意(请参阅下面的spencer7593注释):在所有可能存在NULL的情况下,NOT IN不是一个好的解决方案.相反,应该使用NOT EXISTS条件.我不会详细说明,因为它似乎超出了所提问题的范围(这就是"NOT"解决方案与"MINUS"解决方案不同的原因).
归档时间: |
|
查看次数: |
5149 次 |
最近记录: |