我有一个SQL查询,其别名与其子查询的一些别名相同.
例如:
select * from ROOM r where ... ( select * from ROAD r where ... )
这样可以正常工作,因为子查询的别名似乎隐藏了主要的别名.
>在所有情况下都会这样运作吗?
>我会得到不确定的结果吗?
>如果可以这样做,我该如何引用主查询的r?
解决方法
嵌套子查询可以使用与父查询中使用的相同的别名,尽管对于阅读代码的人来说可能有点混乱.嵌套子查询上别名的名称空间与父项上的名称空间不同.例如,下面的查询有一个嵌套的子查询b,其中也有一个别名b.这可能会让程序员感到困惑,但对DBMS引擎来说很好:
select a.foo,b.bar,b.BarCount from (select b.bar,count (*) as BarCount from BarTable b join OtherTable o on b.OtherTableID = o.OtherTableID group by b.bar) b join Foobar a on a.bar = b.bar
在相关子查询上,您可以访问父项的别名,因此别名在父查询和相关子查询中必须是唯一的.如果我们采用相关的子查询(例如下面的子查询),我们在父查询和相关子查询之间共享一个全局名称空间:
select a.foo,b.bar from Foobar a join Bar b on b.FooBarID = a.FooBarID where not exists (select 1 from Bar b2 where b2.BarCategoryID = b.BarCategoryID and b2.BarDate > b.BarDate)
相关子查询没有别名,因为它不参与连接1. bar的引用b和b2都可用于子查询,因为相关子查询与父项共享其别名的命名空间.