SQL NOT EXISTS(人们讨厌他们认识的每个人)编辑

时间:2015-03-03 11:53:57

标签: sql

所以我有这三个表

Persons {id, name}
    {1, "Jim"}
    {2, "Kim"}
    {3, "Tim"}
    {4, "Brim"}
Knows {id_A, id_B}
    {1,2}
    {1,3}
    {1,4}
    {2,3}
    {4,2}
Hates {id_A, id_B}
    {1,4}
    {2,1}
    {3,1}
    {3,2}
    {4,2}

我想用NOT EXIST获取数据来获取所有讨厌他们认识的人的人的名字。我试过这个问题:

SELECT DISTINCT P.name FROM Persons P, Likes L, Knows K
WHERE K.personA_id = P.id AND L.personA_id = P.id
AND NOT EXISTS
(SELECT * FROM Persons P WHERE L.personA_id = P.id AND L.personB_id <>  K.personB_id)

但是如果一个人知道几个人但又至少厌倦其中一个人,它也会返回名字(例如,这个查询返回{1,&#34; Jim&#34;}即使他知道3个人,但只讨厌他们中的一个)。而且我需要让那些讨厌他们认识的人。帮助!

3 个答案:

答案 0 :(得分:1)

写另一种方式,给我所有认识他们不讨厌的人的人:

SELECT * FROM Persons p
WHERE EXISTS
(
    SELECT 0 FROM Knows k
    WHERE k.personA_id = P.id
    AND NOT EXISTS
    (
        SELECT 0 FROM Hates h
        WHERE k.personA_id = h.personA_id
    )
)

答案 1 :(得分:0)

您没有在子查询中使用其他表。你应该这样做: -

SELECT DISTINCT P.name FROM Persons P, Hates H, Knows K
WHERE K.A_id = P.id AND H.A_id = P.id
AND NOT EXISTS
(SELECT * FROM Persons P, Hates H, Knows K WHERE H.A_id = P.id and H.B_id <> K.B_id)

答案 2 :(得分:0)

我不喜欢不存在,但这是“讨厌他们认识的人”的可能解决方案

SELECT P.name FROM Persons p
WHERE NOT EXISTS 
(
    -- person who knows persons and doesn't hate them
  SELECT * FROM Knows k
   LEFT OUTER JOIN Hates h
   ON (h.id_B = k.id_B and h.id_A = k.id_A)
    WHERE p.id = k.id_A -- join Person
    AND  k.id_B is null
)