如何找到未加入记录?(How do I find records that are not join

2019-07-20 15:06发布

我有连接在一起的两个表。

A有里许多

通常你会:

select * from a,b where b.a_id = a.id

要从有b中记录获取所有的记录。

我如何只是在一个不具有在B什么记录?

Answer 1:

select * from a where id not in (select a_id from b)

或像其他一些人对这个主题说:

select a.* from a
left outer join b on a.id = b.a_id
where b.a_id is null


Answer 2:

select * from a
left outer join b on a.id = b.a_id
where b.a_id is null


Answer 3:

另一种方法:

select * from a where not exists (select * from b where b.a_id = a.id)

在“存在”,如果有一种方法是有用的一些其他“其中”你需要连接到内部查询子句。



Answer 4:

SELECT id FROM a
EXCEPT
SELECT a_id FROM b;


Answer 5:

从其中id不选择*(从B选择A_ID)



Answer 6:

你可能会得到很多更好的性能(比“没有”使用)如果你使用外连接:

select * from a left outer join b on a.id = b.a_id where b.a_id is null;


Answer 7:

这将保护你的IN子句,这可能会导致意外的行为在零点。

从其中id不选择*(从B选择[一个ID]其中,[一ID]不为空



Answer 8:

在一个的情况下,加入它是相当快的,但是当我们从具有约50 milions记录和4和多个数据库中删除记录联接由于外键,它需要几分钟的时间来做到这一点。 更快的使用WHERE NOT IN这样的条件:

select a.* from a
where a.id NOT IN(SELECT DISTINCT a_id FROM b where a_id IS NOT NULL)
//And for more joins
AND a.id NOT IN(SELECT DISTINCT a_id FROM c where a_id IS NOT NULL)

我也可以推荐使用这种方法删除的情况下,我们没有配置级联删除。 这个查询只需要几秒钟。



Answer 9:

第一种方法是

select a.* from a where a.id  not in (select b.ida from b)

第二种方法是

select a.*
  from a left outer join b on a.id = b.ida
  where b.ida is null

第一种方法是非常昂贵的。 第二种方法比较好。

在PostgreSQL 9.4,我做了“说明查询”功能,并第一次查询的成本= 0.00..1982043603.32的成本。 取而代之的是连接查询的成本= 45946.77..45946.78的成本

比如,我搜索不与任何车辆兼容的所有产品。 我有10万级的产品和超过100万间的相容性。

select count(*) from product a left outer join compatible c on a.id=c.idprod where c.idprod is null

连接查询花费了约5秒,而不是子查询的版本从来3分钟后结束。



Answer 10:

写它的另一种方式

select a.*
from a 
left outer join b
on a.id = b.id
where b.id is null

哎哟,由Nathan殴打:)



文章来源: How do I find records that are not joined?