Sql 区别于;选择*”;及;选择Table.Attribute";当使用;除「;

Sql 区别于;选择*”;及;选择Table.Attribute";当使用;除「;,sql,except,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

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

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)

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

因为整个子查询给出不同的结果


。。。除了选择*。
将不同于
。。。除了选择C3.cid…
。也就是说,除了
C3.cid
的值列表之外,
T3、课程C3
的组合在中是不同的

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

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