【发布时间】:2016-12-08 22:11:56
【问题描述】:
我有一个从单个表中检索数据的查询。但是查询使用MINUS 子句,如下所示:
SELECT field1, field2
FROM tab
WHERE field3 = 'a'
AND field4 = 'b'
MINUS
SELECT field1, field2
FROM tab
WHERE field5 = 'c'
AND field6 = 'd'
因为这是从同一个表中选择的,所以我试图重写它以摆脱MINUS 子句。我认为这样的事情应该可以工作:
SELECT DISTINCT field1, field2
FROM tab
WHERE field3 = 'a'
AND field4 = 'b'
AND NOT (field5 = 'c'
AND field6 = 'd')
我的理由是,如果MINUS 子句排除了第二个查询中的记录,那么将WHERE 子句包装在AND NOT 中应该会删除相同的记录。 MINUS 子句也消除了重复项,这就是我在选择中添加DISTINCT 的原因。但是问题是我的查询返回的记录比原始记录多更多。
我在这里错过了什么?
【问题讨论】:
-
第二个查询只检查单个行。 WHERE 子句适用于被访问的每个单独的行。没有参考检查表中是否存在 other 行。获取第一个查询返回的结果类型的规范方法是基于集合的运算符(MINUS 集合操作)、具有相关子查询的 NOT EXISTS 谓词或反连接模式。为了获得与 MINUS 集合运算符相同的折叠行为,我们需要添加一个 GROUP BY 子句。另一种需要 GROUP BY 的方法是对聚合进行 HAVING 检查。