2012-10-14 43 views
0
使用除与INTERSECT

假设我有三个表表A,表B和表C错误在SQL

表A包含具有条目1,2,2,3,4,4山坳T1。
表B的列t2与条目1,3,4,4。
表C列出了条目1,2,4,4。

给出的查询是

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

我看见一个试纸这个问题。有人提到预期答案是2,但是从这个查询中得到的答案是1,2,4。我无法理解这背后的原则。

+0

您正在使用哪些DBMS? – mwigdahl

回答

2

那么,正如我所看到的,预期的答案和你得到的答案都是错误的。它可能是你正在使用的RDBMS,但分析你的查询结果应该是2,3。首先,您应该在表BC之间执行INTERSECT,相交的值是14。拿到这个结果,你应该从表A中除了14之外的所有值,这使得我们有23(因为EXCEPTINTERSECT只返回不同的值)。 Here is a sqlfiddle与此为你尝试。

+0

我们可以使用相交除吗? – demouser123

+0

@geeko_zac - 我不太确定你的意思,你正在使用交叉和除了你的例子 – Lamak

1

由于括号,BC之间的INTERSECT首先完成,导致(1,4)。你甚至可以验证这只是服用下半年和孤立运行:

SELECT * FROM B INTERSECT SELECT * FROM C 

下一步是选择在A一切,除了那些存在于(1,4),这让先前的结果( 2,3)。

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

BTW,应该指出的是,即使你有在查询中没有括号可言,其结果应该还是一样的,因为INTERSECT运算符的优先级高于EXCEPT/UNION运算符。这是SQL Server文档,但它符合适用于实现这些运算符的任何DBMS的标准。