ПОДВЫБОРКА содержит ошибку — но инструкция sql продолжается

#sql-server #tsql

#sql-server #tsql

Вопрос:

У меня есть следующий пример кода:

 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)
  

Ответ №1:

Он наследуется member_id от внешнего запроса, поэтому эквивалентен:

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

Это завершится ошибкой, как и ожидалось:

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

Комментарии:

1. Super: S Почему он это делает? Это MS пытается быть милой и позволить нам обойтись без префикса coloumns — и затем открывается, чтобы это произошло?

2. Это может быть ошибка, лучше всегда указывать в подзапросе; msdn.microsoft.com/en-us/library/ms178050.aspx

3. Это потому, что в этом случае имя столбца уникально внутри полного запроса, поэтому ошибок не возникло. Вопрос, почему внешнему запросу необходимо возвращать свой собственный столбец? Я не уверен, но, возможно, есть пример, где вам действительно нужна такая логика. MS SQL решила, что это запрос такого рода.