Почему нет ошибки в T-SQL? - PullRequest
2 голосов
/ 23 июня 2011

Когда запускается следующий SQL, вы не получите ошибку ни в SQL версии 2005, ни в 2008 R2.

select 1 as MyVal, 'string' as MyText
into #table1

select 1 as thisColumnDoesntExistInTable1, 'string' as MyText
into #table2

select * from #table1
select * from #table2

-- WHY NO ERROR HERE ---    
select *
from #table2
where thisColumnDoesntExistInTable1 in
(
    select thisColumnDoesntExistInTable1 from #table1
)

drop table #table1
drop table #table2

Но если вы измените инструкцию следующим образом, добавив псевдоним во внутренний выбор...

select *
from #table2
where thisColumnDoesntExistInTable1 in
(
    select a.thisColumnDoesntExistInTable1 from #table1 a
)

... вы получаете ошибку.

Ответы [ 3 ]

4 голосов
/ 23 июня 2011

По сути, у вас есть это. Так что без ошибок

select * from #table2 t2
where thisColumnDoesntExistInTable1 in
        (select t2.thisColumnDoesntExistInTable1 from #table1 )

Когда вы квалифицируете это как явное для table1, вы получаете ошибку

2 голосов
/ 23 июня 2011

Объем запроса доступен в подразделе. Вы можете увидеть это более четко, если вы измените то, что в #table2.

select 1 as MyVal, 'string' as MyText
into #table1

select 2 as thisColumnDoesntExistInTable1, 'string' as MyText
into #table2

select * from #table1
select * from #table2

select * from #table2 where thisColumnDoesntExistInTable1 in (select thisColumnDoesntExistInTable1 from #table1 )

drop table #table1
drop table #table2

Как видите, результат будет показывать 2 вместо 1, потому что вы получаете доступ к значению thisColumnDoesntExistInTable1 из #table2.

1 голос
/ 23 июня 2011

Столбец thisColumnDoesntExistInTable1, как говорится, не существует в # table1.В первом запросе, когда компилятор обращается к подзапросу, поскольку столбец не имеет псевдонима, он просматривает все таблицы, включенные в запрос, находит его в одной и использует его оттуда.Во втором запросе столбец является псевдонимом, поэтому SQL проверяет только указанную таблицу для столбца, не находит его и выдает ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...