在SQL中使用EXCEPT和INTERSECT时出错

时间:2012-10-14 03:06:37

标签: sql database

假设我有三个表,表A,表B和表C.

表A包含带有条目1,2,2,3,4,4的col t1 表B具有条目1,3,4,4的col t2 表C具有条目1,2,4,4的col t3。

给出的查询是

SELECT * FROM  A EXCEPT (SELECT * FROM  B INTERSECT SELECT * FROM C ).

我在试卷中看到了这个问题。有人提到预期的答案是2,但从这个问题得到的答案是1,2,4。我无法理解这背后的原理。

2 个答案:

答案 0 :(得分:2)

嗯,正如我所看到的,预期答案和你得到的答案都是错误的。它可能是您正在使用的RDBMS,但分析您的查询结果应为2,3。首先,您应该在表INTERSECTB之间执行C,相交的值为14。获取该结果后,您应该获取除A1之外的表4中的所有值,这样我们就会23(因为{{1} }和EXCEPT仅返回不同的值)。 Here is a sqlfiddle以此为您尝试。

答案 1 :(得分:1)

由于括号,BC之间的INTERSECT首先完成,导致(1,4)。您甚至可以验证这只是采取后一部分并单独运行:

SELECT * FROM  B INTERSECT SELECT * FROM C

下一步是选择A中的所有内容,除了(1,4)的上一个结果中存在的那些内容(2,3)。

答案应该是2和3,而不是1,2和4。

顺便说一句,应该提到的是,即使查询中没有括号,结果也应该相同,因为INTERSECT运算符的优先级高于EXCEPT / UNION运算符。这是SQL Server文档,但它与适用于实现这些运算符的任何DBMS的标准一致。