我无法弄清楚这种语法,但确实有效(英语:获取具有所有PID的MNAME)。
谁能告诉我为什么?
实现相同结果的替代语法是什么?
结果: Sam
SELECT MNAME
FROM M
WHERE NOT EXISTS
( SELECT *
FROM P
WHERE NOT EXISTS
( SELECT *
FROM MP
WHERE MID = M.MID
AND PID = P.PID ) );
答案 0 :(得分: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 :(得分:1)
请查阅WikiPedia文章“Relational Algebra”,特别是那篇文章中的“Division”。我承认,这是心灵健康。据我所知和所信,您提出的解决方案(多个NOT EXISTS)是唯一适用于所有情况的解决方案(经典的关系划分问题)。
奇怪的是,一个非常类似的问题出现在另一个论坛上,我提出了你展示的解决方案;当我提出这个解决方案时,OP似乎并不相信我。
Wietze314的解决方案适用于您的数据集;不一定适用于所有情况。只要Sam在表MP中有六行(且只有六行) - 无论P1和P6是否都被表示,那么该解决方案将起作用。