2013-09-30 69 views
1

我無法制定出此語法,但它確實有效(英語:獲取具有所有PID的MNAME)。SQL獲取具有所有值的實體

有誰能告訴我爲什麼?

什麼是實現相同結果的替代語法?

結果:山姆

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

database

回答

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)) 
1

請查找該文章在維基百科的文章 「關係代數」,特別是 「師」。我承認,這是大腦的彎曲。就我所知和所信,您提出的解決方案(多個NOT EXISTS)是唯一適用於所有案例(經典關係分解問題)的解決方案。

奇怪的是,這個問題非常類似的問題出現在另一個論壇上,我提出了你展示的解決方案;當我提出這個解決方案時,OP似乎並不相信我。

Wietze314的解決方案將工作 - 爲您的數據集;不一定適用於所有情況。只要Sam在表MP中有6行(並且只有6行) - 不管P1 ... P6是否全部被表示,那麼該解決方案將起作用。

+0

是的,它很難讓你的頭。在上面的例子中,我不能單獨執行內部查詢,也不知道爲什麼。如果我給它添加表名,'FROM MP,P,M'。整個查詢給出了錯誤的答案。 @客人 – ojhawkins