准备数据:
create table class_a2(
id int not null,
name varchar(100) not null
);
insert into class_a2(id, name)
values(1, '田中'),
(2, '铃木'),
(3, '尹集院');
/*
id | name
----+--------
1 | 田中
2 | 铃木
3 | 尹集院
(3 rows)
*/
create table class_b2(
id int not null,
name varchar(100) not null
);
insert into class_b2(id, name)
values(1, '田中'),
(2, '铃木'),
(4, '西园寺');
/*
id | name
----+--------
1 | 田中
2 | 铃木
4 | 西园寺
(3 rows)
*/
思路:
思路一(使用了关联子查询, 性能会不太好):
select * from class_a2
where not exists (select *
from class_b2
where class_b2.id = class_a2.id);
/*
id | name
----+--------
3 | 尹集院
(1 row)
*/
思路二(使用左或右外连接取补集):
select a.id, a.name
from class_a2 a
left outer join class_b2 b
on a.id = b.id
where b.name is null;
/*
id | name
----+--------
3 | 尹集院
(1 row)
*/
🤓虽然使用外连接来求补集/差集不符合外连接设计的目的, 但是对于支持差集运算的数据库, 这种方式比not in和not exists写法在性能佘昂更加高效