计算表中未引用的行数

问题描述

我有一个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)的外键,则这些索引已经存在。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...