概述
假设有两张表,A表和B表
A表:
| id | name | age |
|---|---|---|
| 1 | xxx | 15 |
| 2 | yyy | 18 |
| 3 | zzz | 20 |
B表:
| id | b_id | age |
|---|---|---|
| 1 | 1 | 15 |
| 2 | 2 | 18 |
其中B表的b_id字段引用了A表的id字段。现在有个查询需求:
给出已知的A表中的id,比如:id in (1,2,3),找出这些id在B表中没有与之对应的记录。比如说上面A表中的id=3这条记录,B表中没有b_id与之对应
利用子查询
SELECT
a.id
FROM
A a
WHERE a.id IN (1,2,3)
AND NOT EXISTS
(SELECT
1
FROM
B b
WHERE b.b_id = a.id)
利用上面的子查询就可以达到目的。
注意:
这个SQL 虽然可以用到索引,但是一定注意入参的个数,如果入参id的个数太多的话,性能有点问题。因为这个SQL会根据入参,一个一个执行子查询,进行比对的。
利用left join
这篇博文的有个网友提供了另外一种方式(请看这篇博文该网友的回复),这里感谢这位网友,下面把他的方案贴出来,如下:
select
a.id
from
A a
left join B b on a.id = b.b_id
where
a.id IN (1, 2, 3)
and b.id is null
这样也可以用到索引,并且避免使用子查询。
本文介绍两种方法来找出A表中ID在B表中未出现的记录:一是使用子查询结合NOT EXISTS,二是采用LEFT JOIN并检查NULL值。这两种方法都能有效利用索引提高查询效率。
174万+

被折叠的 条评论
为什么被折叠?



