0

假设我有三个表表 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。我无法理解这背后的原理。

4

2 回答 2

2

好吧,在我看来,预期的答案和您获得的答案都是错误的。它可能是您正在使用的 RDBMS,但分析您的查询结果应该是2,3. 首先你应该做INTERSECT表之间的BC,相交的值是14。获取该结果,您应该从表中获取A1and之外的所有值4,这给我们留下了2and 3(因为EXCEPTandINTERSECT只返回不同的值)。这是一个 sqlfiddle供您尝试。

于 2012-10-14T03:35:19.140 回答
1

因为有括号,和之间的INTERSECT先做BC得到(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 的标准一致。

于 2012-10-14T03:38:23.160 回答