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
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 回答
1

请查阅维基百科文章“关系代数”,特别是该文章中的“除法”。我承认,这令人费解。据我所知和所信,您提出的解决方案(多个不存在)是唯一适用于所有情况的解决方案(经典的关系除法问题)。

奇怪的是,一个与这个问题非常相似的问题出现在另一个论坛上,我提出了你展示的解决方案;当我提出这个作为解决方案时,OP 似乎不相信我。

Wietze314 的解决方案适用于您的数据集;不一定适用于所有情况。只要 Sam 在表 MP 中有六(并且只有六)行 - 无论 P1...P6 是否都被表示,那么该解决方案将起作用。

于 2013-09-30T16:42:31.600 回答