“ NOT EXISTS”和“ NOT IN”有什么区别

时间:2019-11-16 12:53:42

标签: postgresql

对于学校,我需要让所有从未与1号球队比赛的球员。因此,我想我会在子查询中查找所有与1号球队比赛的球员。这是我的子查询:

select distinct s.spelersnr, naam 
from spelers s inner join wedstrijden w on (s.spelersnr = w.spelersnr and teamnr = 1)

现在要提取从未参加过第1队比赛的球员,我想我可以使用“ NOT EXISTS”运算符。然后,我的查询如下所示:

select spelersnr, naam
from spelers
where not exists (select distinct s.spelersnr, naam
from spelers s inner join wedstrijden w on (s.spelersnr = w.spelersnr and teamnr = 1))
order by naam, spelersnr

但是此查询未返回我需要的结果(实际上它未返回任何内容)。然后,我尝试了以下查询:

select spelersnr, naam
from spelers
where (spelersnr, naam) not in (select distinct s.spelersnr, naam
from spelers s inner join wedstrijden w on (s.spelersnr = w.spelersnr and teamnr = 1))
order by naam, spelersnr

此查询返回了我需要的结果,但是现在我真的不明白“ NOT EXISTS”和“ NOT IN”之间的区别。

1 个答案:

答案 0 :(得分:2)

靠近您时,不存在不输入之间的区别是使用不输入执行SQL的方式速度较慢(显然,这取决于所涉及的数据集的大小),因为它会将每一行与子句中的每个项目进行比较。

EXISTS NOT EXISTS 相反,它根据上下文where子句对单行进行查找。

示例中所缺少的只是 EXISTS

中的 WHERE 子句
select spelersnr, naam
from spelers as sp
where not exists (select 1
from spelers s inner join wedstrijden w on (s.spelersnr = w.spelersnr and teamnr = 1)
where sp.spelersnr = s.spelersnr and sp.naam = s.naam)
order by naam, spelersnr

希望这会有所帮助:)