轉:
select * from A where 1=1 AND A.ID not in (select ID from B )
這種情況是針對數據量比較小的情況使用的,原因在於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;