问题描述
我有一个表addresses
和许多表,其中有一个引用地址的address_id
列(都具有外键约束)。我想找到其他表中未引用的地址数。
我尝试了以下查询,但是速度很慢:
SELECT COUNT(*)
FROM addresses A
LEFT JOIN customers C ON C.address_id = A.id
LEFT JOIN agreements AG ON AG.address_id = A.id
LEFT JOIN products P ON P.address_id = A.id
LEFT JOIN letters L ON L.address_id = A.id
WHERE C.id IS NULL
AND AG.id IS NULL
AND P.id IS NULL
AND L.id IS NULL
解决方法
我首先用not exists
重写它:
select count(*)
from addresses a
where
not exists (select 1 from customers c where c.address_id = a.id)
and not exists (select 1 from agreements g where g.address_id = a.id)
and not exists (select 1 from products p where p.address_id = a.id)
and not exists (select 1 from letters l where l.address_id = a.id)
然后,请确保具有以下索引以加快查询速度:
customers(address_id)
agreements(address_id)
products(address_id)
letters(address_id)
如果您已正确地将address_id
列定义为address(id)
的外键,则这些索引已经存在。