假设我有三个表表 A、表 B 和表 C。
表 A 包含带有条目 1、2、2、3、4、4 的 col t1。
表 B 有 col t2 条目 1,3,4,4。
表 C 有 col t3 条目 1,2,4,4。
给出的查询是
SELECT * FROM A EXCEPT (SELECT * FROM B INTERSECT SELECT * FROM C ).
我在试卷上看到了这个问题。有人提到,预期的答案是 2,但从这个查询中获得的答案是 1,2,4。我无法理解这背后的原理。
好吧,在我看来,预期的答案和您获得的答案都是错误的。它可能是您正在使用的 RDBMS,但分析您的查询结果应该是2,3
. 首先你应该做INTERSECT
表之间的B
和C
,相交的值是1
和4
。获取该结果,您应该从表中获取A
除1
and之外的所有值4
,这给我们留下了2
and 3
(因为EXCEPT
andINTERSECT
只返回不同的值)。这是一个 sqlfiddle供您尝试。
因为有括号,和之间的INTERSECT先做B
,C
得到(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 的标准一致。