MySQL查询用于查找一个表中但不是另一个表中的行

时间:2013-08-01 17:20:27

标签: mysql join

假设我在两个表中有大约25,000条记录,每条记录中的数据应该相同。如果我需要找到表A中但不在表B中的任何行,那么最有效的方法是什么。

我们已经尝试将其作为一个表的子查询和NOT IN结果,但这会运行超过10分钟,几乎崩溃我们的网站。

必须有更好的方法。也许是JOIN

4 个答案:

答案 0 :(得分:3)

希望LEFT OUTER JOIN将完成这项工作

select t1.similar_ID 
    , case when t2.similar_ID is not null then 1 else 0 end as row_exists
from table1 t1
left outer join (select distinct similar_ID from table2) t2
   on t1.similar_ID  = t2.similar_ID // your WHERE goes here

答案 1 :(得分:2)

I would suggest you read the following blog post, which goes into great detail on this question

  

哪种方法最好选择一个表中存在但缺少的值   在另一个?

经过深入分析后,得出以下结论:

  

但是,这三种方法[NOT INNOT EXISTSLEFT JOIN]   生成三个不同的计划,由三个不同的执行   代码片段。执行EXISTS谓词的代码约为30%   效率低于执行index_subqueryLEFT JOIN的效率低   优化使用Not exists方法。

     

这就是为什么在MySQL中搜索缺失值的最佳方法是使用LEFT JOIN / IS NULLNOT IN而不是NOT EXISTS

如果您使用NOT IN看到的效果不理想,则切换为LEFT JOIN / IS NULLNOT EXISTS并不会改善此效果,相反,您需要采用不同的路线来优化此查询,例如添加索引

答案 2 :(得分:0)

使用exixts and not exists功能

Select * from A where not exists(select * from B);

答案 3 :(得分:0)

左连接。来自the mysql documentation

  

如果ON或USING中的右表没有匹配的行   在LEFT JOIN中,使用所有列设置为NULL的行   合适的桌子。您可以使用此事实查找表中的行   在另一张表中没有对应物:

     

SELECT left_tbl。* FROM left_tbl LE​​FT JOIN right_tbl ON left_tbl.id =   right_tbl.id WHERE right_tbl.id IS NULL;

     

此示例查找left_tbl中的所有行,其id值不是   出现在right_tbl中(也就是说,left_tbl中的所有行都没有   right_tbl中的相应行。