table 别名在子选择中的可见性是故意的还是错误?

Is the visibility of table aliases out of subselects intentional or a bug?

考虑以下查询:

select
  s.word
  ,s.word
  ,x.word
  ,x.s.word

from (select
        s.word 

      from publicdata:samples.shakespeare s

      where corpus = '1kinghenryiv') x

order by
  word

事实证明,如果不在子选择中应用别名,则不仅可以使用 wordx.word 引用表达式,还可以使用 s.word 和甚至 x.s.word

来自 SQL 服务器,这让我感到惊讶。这很烦人,因为如果上层有另一个 table 别名,它会导致歧义错误。而且看起来完全是多余的。

这种行为是故意的还是错误?

我确实认为使用点符号是这里的一项功能,而不是错误(仍然可能)

如果您想 "stop" 点链并避免歧义,您应该为相应字段提供明确的别名

例如,以下将失败:

select
  word
  ,s.word
  ,x.word
  ,x.s.word
from (select
        s.word AS SWORD -- << added alias
      from publicdata:samples.shakespeare s
      where corpus = '1kinghenryiv') x
order by word

这些情况下的别名语义确实有点不稳定,但在不破坏用户依赖的查询的情况下很难更改它们,我们的主要目标是确保现有查询继续工作。

我们确实有计划用我们的 SQL 方言解决其中的一些问题。敬请期待!