我正在努力寻找教授所有课程的教授。当我执行以下操作时,我得到了正确的答案。
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)
我没想到这两个查询会有所不同。为什么第二个没有返回?
答案 0 :(得分:1)
因为整个子查询会产生不同的结果。
... EXCEPT SELECT * ...
与... EXCEPT SELECT C3.cid ...
不同。也就是说,Teaches T3, Courses C3
的组合在EXCEPT中与C3.cid
的值列表不同。
答案 1 :(得分:1)
因为EXCEPT
比较行(并从第一个操作数返回不同的行)。
显然,在第二种情况下,嵌套查询的结果是不同的,所以你什么也得不到