MINUS vs NOT in where子句

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到选择中的原因.然而问题是,我的查询返回比原来的记录.

我在这里错过了什么?

mat*_*guy 5

考虑这两行:

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"解决方案不同的原因).