首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL NOT IN (不认识吸烟的人)

SQL NOT IN (不认识吸烟的人)
EN

Stack Overflow用户
提问于 2015-03-02 23:24:09
回答 3查看 65关注 0票数 3

我有三张桌子:

代码语言:javascript
复制
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"}认识吉姆,所以他出去了)

我尝试了这个查询:

代码语言:javascript
复制
SELECT P.name 
FROM Persons P, Knows K
WHERE K.A_id = P.id AND K.B_id NOT IN (SELECT id FROM Smokes)

但它仍然返回“提姆”,即使他认识两个人,其中只有一个是吸烟。我只需要每个“朋友”都不吸烟的人。帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-02 23:48:31

代码语言:javascript
复制
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
   );
票数 1
EN

Stack Overflow用户

发布于 2015-03-02 23:39:13

请允许我解释如何用集合论/ SQL术语来思考您的问题:

  1. 你需要一个总和的总人数,任何给定的人知道谁吸烟。
  2. 然后对聚集值为零的人进行筛选。

这导致:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2015-03-03 00:11:50

与其试图找出所有不认识吸烟者的人,我认为更容易找到所有认识吸烟者的人,然后将结果倒置。

代码语言:javascript
复制
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子句将过滤掉所有认识吸烟者的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28821320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档