2

私はすべてのコースを教えた教授を見つけようとしています。以下を実行すると、正解が得られます。

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)

ただし、これを実行すると、nullセットが取得されます。

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つのクエリが異なるとは思っていませんでした。なぜ2番目のものは何も返さないのですか?

4

2 に答える 2

1

サブクエリ全体で異なる結果が得られるためです。

... EXCEPT SELECT * ...とは異なり... EXCEPT SELECT C3.cid ...ます。つまり、の組み合わせは、Teaches T3, Courses C3の値のリストを除いて異なりますC3.cid

于 2011-12-12T20:56:36.500 に答える
1

行を比較するためEXCEPT(そして最初のオペランドから異なる行を返すため)。

明らかに、2番目のケースでは、ネストされたクエリの結果が異なるため、何も得られません

于 2011-12-12T20:57:13.923 に答える