Mysql 在A中查找在B中没有关联行的行,其中FK位于B上?
我一直在做的是Mysql 在A中查找在B中没有关联行的行,其中FK位于B上?,mysql,sql,database,Mysql,Sql,Database,我一直在做的是 SELECT * FROM a LEFT JOIN b ON b.a_id=a.id WHERE b.id IS NULL 基本上,我试图找到没有关联b的a行,其中外键存储在b上。这是正确的方法,还是有其他类型的联接来执行此操作?是的,这是正常的方法,我不知道还有更好的方法。您正在寻找的联接不存在: 在b.a_id上有一个索引有助于此查询的性能。您可以尝试 Select * from a where a.id not in (Select a_id from b) 前面的三个
SELECT * FROM a LEFT JOIN b ON b.a_id=a.id WHERE b.id IS NULL
基本上,我试图找到没有关联b的a行,其中外键存储在b上。这是正确的方法,还是有其他类型的联接来执行此操作?是的,这是正常的方法,我不知道还有更好的方法。您正在寻找的联接不存在: 在b.a_id上有一个索引有助于此查询的性能。您可以尝试
Select * from a where a.id not in (Select a_id from b)
前面的三个回答都是正确的,在这一点上,我认为您可以考虑这三种查询的性能。您可以查看此URL:
在我看来,外接是最好的方式,如果行数不多,三种方式大致相等。@Denis:当然不是。当b.a_id上有一个索引时,速度会非常快。+1-另请参见:尽管查询的格式表明,每个记录的EXISTS都作为一个单独的查询进行检查,但情况并非如此。优化过程能够以非常类似于传统连接的方式理解关系,因此它实际上非常有效。我认为这是更好的方法。Joe在另一个线程上发布了该链接,让我早些时候做了一些实验。在Postgres上,notexists和LEFT JOIN/IS NULL生成了相同的计划,至少在我输入的特定随机数据下是如此。我只会在实际测试的基础上,根据表的大小和手头问题的数据分布,在这两者之间进行选择。例如,MySQL可能有完全不同的优化。在其他条件相同的情况下,我发现连接更容易阅读,只是bc较短。@Andrea Girardi:首先,这应该是从b中选择a_id,除此之外,如果子查询返回的值中存在NULL,这将失败。
Select * from a where a.id not in (Select a_id from b)