標籤:style blog http color 使用 strong 資料 ar
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的區別用法這裡就不在講述,大家可以查詢相關資料
對於in 和 exists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是IN,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係了 ,另外IN是不對NULL進行處理。
http://www.cnblogs.com/xiaoqiangzhou/p/3919270.html