在A中查找A中没有关联行的行,其中FK在B上?

时间:2011-05-31 16:09:17

标签: mysql sql database

我一直在做的是

SELECT * FROM a LEFT JOIN b ON b.a_id=a.id WHERE b.id IS NULL

基本上,我正在尝试查找没有关联a的{​​{1}}行,其中外键存储在b上。这是正确的方法吗,还是有不同类型的联接来做到这一点?

4 个答案:

答案 0 :(得分:7)

您正在寻找NOT EXISTS

SELECT 
  * 
FROM 
  a
WHERE
  NOT EXISTS (SELECT 1 FROM b WHERE a_id = a.id)

b.a_id上建立索引有助于提高此查询的效果。

答案 1 :(得分:5)

是的,这是正常的方式,我不知道更好的方法。

答案 2 :(得分:2)

你可以尝试

Select * from a where a.id not in (Select a_id from b)

答案 3 :(得分:1)

之前的三个回答都是正确的,此时我认为你可以考虑三种查询的表现。您可以查看以下网址:

http://rockycode.com/blog/not-vs-outer-join-performance/

在我看来,我认为外部联接是最好的方式,如果你没有太多的行,那么这三种方式或多或少相等。