为什么T-SQL没有错误?

时间:2011-06-23 14:08:55

标签: sql sql-server-2005 tsql sql-server-2008

运行以下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 个答案:

答案 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仅检查引用的表中的列,找不到它,并抛出错误。