根据表中FK的存在获取表的行数

时间:2012-10-05 09:38:21

标签: mysql sql

我想在tableA中获取行数,当且仅当rowA_x没有FK指向rowB_x中的tableB时。

表A:

id | id_tableB

tableB的

id | ...

所以基本上tableA中的行只应在id_tableA中的id列不存在的情况下计算。

是否有 clean 方法进行此类计数。我有大约500,000行。

3 个答案:

答案 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)