在开发过程中,总有一些需求是需要查看在A表中ID不存在于B表中的ID的情况:
下面有三种方法可以实现这一需求:
第一种:使用Not in 方法通过子查询的结果集来做过滤:
select * from A where 1=1 AND A.ID not in (select ID from B )
这种情况最常见也是最容易理解的逻辑SQL代码,但是会有很多问题出现。
首先,这种情况是针对数据量比较小的情况使用的,原因在于IN 和 NOT IN并不是针对索引进行查询的,操作效率相对较慢。可以通过使用NOT EXISTS 关键字进行优化,相对IN来说EXISTS的效率要高一些,应该在开发过程中尽量少使用in,并改为left join左连接进行查询过滤。
其次,使用not in 会出现查询结果不符合预期的情况:(测试了很多遍发现原因是因为子查询结果集中存在NULL值)
所以在使用in的时候,需要注意下面两种情况:
1.在使用IN 和 NOT IN 时要注意 IN范围中有NULL和空值的情况
2.在where语句中考虑NULL的同时要考虑空字符串的情况
第二种:在卡法中最常见的left join 方法,实现数据的过滤。
SELECT * FROM A LEFT JOIN B ON A.Id=B.Id WHERE 1=1 AND B.Id IS NULL;
第三种:查询速度最快,在应用到插入数据时,可在避免重复插入相同数据时又可以获取较快的时效,速度比上两个快非常多,但是不常见。
SELECT * FROM A WHERE 1=1 AND (SELECT COUNT(1) FROM B WHERE A.Id=B.Id)=0;