我有一个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都可用于子查询,因为相关子查询与父项共享其别名的命名空间.