Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在A中查找在B中没有关联行的行,其中FK位于B上?_Mysql_Sql_Database - Fatal编程技术网

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)