假设我有三个表,表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。我无法理解这背后的原理。
答案 0 :(得分:2)
嗯,正如我所看到的,预期答案和你得到的答案都是错误的。它可能是您正在使用的RDBMS,但分析您的查询结果应为2,3
。首先,您应该在表INTERSECT
和B
之间执行C
,相交的值为1
和4
。获取该结果后,您应该获取除A
和1
之外的表4
中的所有值,这样我们就会2
和3
(因为{{1} }和EXCEPT
仅返回不同的值)。 Here is a sqlfiddle以此为您尝试。
答案 1 :(得分:1)
由于括号,B
和C
之间的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的标准一致。