2011-05-31 80 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