对于学校,我需要让所有从未与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”之间的区别。
答案 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
希望这会有所帮助:)