我想在tableA
中获取行数,当且仅当rowA_x
没有FK
指向rowB_x
中的tableB
时。
表A:
id | id_tableB
tableB的
id | ...
所以基本上tableA
中的行只应在id_tableA
中的id
列不存在的情况下计算。
是否有 clean 方法进行此类计数。我有大约500,000行。
答案 0 :(得分:1)
有几种(不是100%肯定MySQL语法,所以这可能需要一些调整):
使用NOT IN进行子选择:
select count(*) from tableA where id_tableB not in (select id from tableB);
使用NOT EXISTS进行子选择:
select * from tableA a
where NOT EXISTS (select null from tableB b where a.id_tableB = b.id);
外部加入:
select count(*) from (
select a.*, b.id as b_id
from tableA a
left join tableB b on a.id_tableB = b.id)
where b_id IS NULL;
其中哪一项最快取决于您的数据,但通常情况下,JOIN比子查询更有效。
答案 1 :(得分:0)
我能想到的最有效的方法是使用子查询:
SELECT COUNT(*)
FROM tableA
WHERE id_tableB NOT IN (
SELECT id
FROM tableB
)
;
编辑:但是,经过进一步考虑,以下查询实际上可能更有效,因为它使用LEFT OUTER JOIN
而不是子查询。
SELECT COUNT(*)
FROM tableA A
LEFT OUTER JOIN tableB B
ON A.id_tableB= B.id
WHERE B.id IS NULL
;
答案 2 :(得分:0)
也许你可以使用WHERE NOT EXISTS()
结构。
如果我理解你的问题,你的最终查询将如下:
SELECT COUNT(*)
FROM tableA
WHERE NOT EXISTS (SELECT id FROM tableB WHERE tableA.id = tableB.id_tableA)