sql-server – 子查询的别名与主查询的别名相同

前端之家收集整理的这篇文章主要介绍了sql-server – 子查询的别名与主查询的别名相同前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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都可用于子查询,因为相关子查询与父项共享其别名的命名空间.

1请注意,尽管指定的实际操作是相关子查询而不是嵌套子查询的连接,但优化器可以选择在后台使用计划中的连接运算符.

猜你在找的MsSQL相关文章