运行以下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
)
...你确实收到了错误。
答案 0 :(得分:4)
实际上,你有这个。所以没有错误
select * from #table2 t2
where thisColumnDoesntExistInTable1 in
(select t2.thisColumnDoesntExistInTable1 from #table1 )
如果您将此限定为table1的显式,则会收到错误
答案 1 :(得分:2)
查询范围在子选择中可用。如果你改变#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
的值。
答案 2 :(得分:1)
列thisColumnDoesntExistInTable1没有,正如它所说,存在于#table1中。在第一个查询中,当编译器命中子查询时,由于该列没有别名,因此查找查询中涉及的所有表,在一个查找中查找它,并从那里使用它。在第二个查询中,该列是别名,因此SQL仅检查引用的表中的列,找不到它,并抛出错误。