假设我有三个表表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。我无法理解这背后的原则。
假设我有三个表表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。我无法理解这背后的原则。
那么,正如我所看到的,预期的答案和你得到的答案都是错误的。它可能是你正在使用的RDBMS,但分析你的查询结果应该是2,3
。首先,您应该在表B
和C
之间执行INTERSECT
,相交的值是1
和4
。拿到这个结果,你应该从表A
中除了1
和4
之外的所有值,这使得我们有2
和3
(因为EXCEPT
和INTERSECT
只返回不同的值)。 Here is a sqlfiddle与此为你尝试。
我们可以使用相交除吗? – demouser123
@geeko_zac - 我不太确定你的意思,你正在使用交叉和除了你的例子 – Lamak
由于括号,B
和C
之间的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的标准。
您正在使用哪些DBMS? – mwigdahl