select * from tuser where userno not in(select userno from filter_barcode)
上面這條語句子查詢裡,userno 并不存在filter_barcode表中,但是整個語句确能正常執行(執行子查詢的話會報字段不存在的提示),而且傳回的是tuser表中所有的結果集。如果大家不注意這種情況,一旦不是用來查詢,是用來删除的,那整個表資料就被不知不覺給删除了。
原因:原來是在不使用表别名的前提下如果in子查詢裡字段在内表找不到就會去引用外表的。
以下四條是我從其他地方看到的,貼出來給大家參考
1.子表引用父表列,而自己沒有,在子表有資料的情況下,傳回所有非空鍵的父表記錄,子表為空,則結果無
2.子表引用父表屬性,隻有最外層子查詢才能引用
3.有字首辨別,按字首,如果子表父表字首一樣,按4的規則
4.如果無字首辨別唯一性,子查詢表也有此字段,那麼以局部子查詢為準
如果字首一樣,子查詢存在此字段,則以子查詢表為準,否則以父表的為準
總結;為了避免這種問題有幾個方法供大家參考
1、當需要用到in子查詢時,先執行下in裡面的子查詢語句是否有誤,如果誤則進行相應修改
2、使用表字首(别名)才是硬道理,例如
3、使用exists語句來代替in語句
關于exists和in的差別用法這裡就不在講述,大家可以查詢相關資料