SQL获取具有所有值的实体

时间:2013-09-30 14:17:05

标签: sql

我无法弄清楚这种语法,但确实有效(英语:获取具有所有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 ) );

database

2 个答案:

答案 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是否都被表示,那么该解决方案将起作用。