not in 想變成 not exists,發現語義相等了,但是還是得到的數據不一致,在處理null時就出現意外了。
SELECT * from CW_HP_SKR
where khh not in (select yhmc from CW_PJDATA_FKH);
SELECT * from CW_HP_SKR a
WHERE
NOT EXISTS (SELECT b.* FROM CW_PJDATA_FKH b WHERE b.yhmc = a.khh )
現象
原因
是因爲子查詢中的表CW_PJDATA_FKH列yhmc存在空null值,以及主表CW_HP_SKR列khh存在null值,如果在not in子查詢中有null值的時候,則不會返回數據 相當於 ‘231’=null 不返回數據
修改
SELECT * from CW_HP_SKR
where khh IS NULL OR khh not in (select yhmc from CW_PJDATA_FKH WHERE YHMC IS NOT NULL);
結果:但是會發現速度很慢
結論
最好控制本案例中的yhmc與khh中的值都不爲空,或者使用not exists 關聯