1

この構文を理解することはできませんが、機能します (英語: すべての PID を持つ MNAME を取得します)。

誰でも理由を教えてもらえますか?

同じ結果を達成するための代替構文は何ですか?

結果: サム

SELECT MNAME
    FROM M
    WHERE NOT EXISTS
             ( SELECT *
               FROM P
               WHERE NOT EXISTS
                         ( SELECT *
                           FROM MP
                           WHERE MID = M.MID
                           AND PID = P.PID ) );

データベース

4

2 に答える 2

1

ウィキペディアの記事「関係代数」、特にその記事の「除算」を調べてください。それは気が狂っています、私は認めます。私の知る限り、あなたが提案する解決策(複数のNOT EXISTS)は、すべてのケースで機能する唯一の解決策です(古典的な関係分割の問題)。

奇妙なことに、これと非常によく似た質問が別のフォーラムで出てきたので、あなたが示す解決策を提案しました。これを解決策として提案したとき、OPは私を信じていないようでした。

Wietze314のソリューションは機能します-データセットに対して。必ずしもすべての状況に当てはまるわけではありません。Sam がテーブル MP に 6 つの行 (そして 6 つだけ) を持っている限り、P1...P6 がすべて表されているかどうかに関係なく、そのソリューションは機能します。

于 2013-09-30T16:42:31.600 に答える
1
SELECT M.MID
FROM M
WHERE M.MID IN 
(SELECT MP.MID 
FROM MP 
GROUP BY MP.MID 
HAVING COUNT(*) = (SELECT COUNT(*) FROM P))
于 2013-09-30T14:40:54.823 に答える