我有以下示例代码:

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)

最佳答案

它从外部查询继承了member_id,因此等效于:

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

这将按预期失败:
   ...
   (select #tempmembers.member_id from #tempmembers)

09-18 01:37