使用“EXCEPT”时“SELECT *”和“Select Table.Attribute”之间的区别

时间:2011-12-12 20:53:42

标签: sql except

我正在努力寻找教授所有课程的教授。当我执行以下操作时,我得到了正确的答案。

select P1.pid
from Professors P1
where NOT EXISTS(select C2.cid
                from Teaches T2, Courses C2
                where T2.cid = C2.cid
                EXCEPT
                select C3.cid
                from Teaches T3, Courses C3
                where T3.cid = C3.cid AND T3.pid = P1.pid)

但是,当我执行此操作时,我得到一个空集:

select P1.pid
from Professors P1
where NOT EXISTS(select *
                from Teaches T2, Courses C2
                where T2.cid = C2.cid
                EXCEPT
                select *
                from Teaches T3, Courses C3
                where T3.cid = C3.cid AND T3.pid = P1.pid)

我没想到这两个查询会有所不同。为什么第二个没有返回?

2 个答案:

答案 0 :(得分:1)

因为整个子查询会产生不同的结果。

... EXCEPT SELECT * ...... EXCEPT SELECT C3.cid ...不同。也就是说,Teaches T3, Courses C3的组合在EXCEPT中与C3.cid的值列表不同。

答案 1 :(得分:1)

因为EXCEPT比较行(并从第一个操作数返回不同的行)。

显然,在第二种情况下,嵌套查询的结果是不同的,所以你什么也得不到