A表中數據在B表不存在的數據

轉:

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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章