加入收藏 | 设为首页 | 会员中心 | 我要投稿 财气旺网 - 海宁网 (https://www.hainingwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2021-01-08 03:21:10 所属栏目:编程 来源:网络整理
导读:我有一个SQL查询,其别名与其子查询的一些别名相同. 例如: select *from ROOM rwhere ... ( select * from ROAD r where ... ) 这样可以正常工作,因为子查询的别名似乎隐藏了主要的别名. 在所有情况下都会这样运作吗? 我会得到不确定的结果吗? 如果可以这样

我有一个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请注意,尽管指定的实际操作是相关子查询而不是嵌套子查询的连接,但优化器可以选择在后台使用计划中的连接运算符.

(编辑:财气旺网 - 海宁网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!