我有三张桌子:
Persons {id, name}
Knows {A_id, B_id} - (Person A knows Person B)
Smoking {id} - (id -> Persons{id})
Persons:
{1, "Tim"}
{2, "Kim"}
{3, "Jim"}
{4, "Rim"}
Knows:
{1, 2}
{1, 3}
{3, 2}
{3, 4}
Smoking:
{3}我需要{3," Jim "}返回,因为他不认识抽烟的人({1,"Tim"}认识吉姆,所以他出去了)
我尝试了这个查询:
SELECT P.name
FROM Persons P, Knows K
WHERE K.A_id = P.id AND K.B_id NOT IN (SELECT id FROM Smokes)但它仍然返回“提姆”,即使他认识两个人,其中只有一个是吸烟。我只需要每个“朋友”都不吸烟的人。帮助!
发布于 2015-03-02 23:48:31
SELECT p.name
FROM Persons p
WHERE NOT EXISTS ( -- there does not exist
SELECT * FROM Knows k -- a person I know
JOIN smokes s ON s.id = k.b_id -- who smokes
WHERE k.A_id = p.id
);发布于 2015-03-02 23:39:13
请允许我解释如何用集合论/ SQL术语来思考您的问题:
这导致:
select P.Name
from Persons P inner join Knows K on K.A_Id = P.ID
left join Smoking on Smoking.ID = P.B_Id
group by person
having sum(smoking.ID) = 0发布于 2015-03-03 00:11:50
与其试图找出所有不认识吸烟者的人,我认为更容易找到所有认识吸烟者的人,然后将结果倒置。
select *
from persons P
LEFT JOIN smoking s
INNER JOIN knows k
on k.B_id = s.id
on k.A_id = P.id
where s.id is null知道者和吸烟者之间的内在联系将被运行,以找到所有认识一个吸烟者的人。where子句将过滤掉所有认识吸烟者的人。
https://stackoverflow.com/questions/28821320
复制相似问题