2011-05-31 42 views
3

我有下面的代碼示例:子查詢中包含一個錯誤 - 但sql語句繼續

create table #tempmembers (
    memberid int 
) 

update Members set 
Member_EMail = NULL 
where Member_ID in (select member_id from #tempmembers) 

的子查詢中包含一個錯誤,因爲#tempmembes不包含名爲member_id列,但SQL語句運行沒有任何錯誤並且不更新行。

如果我再補充一點一行到#tempmembers

create table #tempmembers (
    memberid int 
) 
insert into #tempmembers select 1 

update Members set 
Member_EMail = NULL 
where Member_ID in (select member_id from #tempmembers) 

它仍然運行沒有任何錯誤 - 但這次是在成員的所有記錄都將受到影響。

爲什麼SQL語句沒有完全失敗?而如果沒有子選擇進行評估,以NULL - 應該在更新中Members所有行不僅發生,如果那是:

update Members set 
Member_EMail = NULL 
where Member_ID not in (select member_id from #tempmembers) 

回答

3

它從查詢繼承member_id所以等同於:

... 
    (select Members.member_id from #tempmembers) 

這將無法按照預期:

... 
    (select #tempmembers.member_id from #tempmembers) 
+0

超:S 爲什麼母鹿它這樣做?是MS試圖變得更好,並讓我們避免不加前綴的彩色 - 然後打開這發生? – 2011-05-31 13:49:08

+0

它可能是一個陷阱,最好總是在子查詢中有資格; http://msdn.microsoft.com/en-us/library/ms178050.aspx – 2011-05-31 13:54:02

+0

這是因爲在這種情況下,列名稱在完整查詢中是唯一的,所以不會引發錯誤。問爲什麼外層查詢確實需要返回自己的列?我不確定,但也許有一個例子,你真的需要這樣的邏輯。 MS SQL決定它是這樣的查詢。 – Dalex 2011-05-31 13:56:22

相關問題