我在查询中使用了两次相同的别名(RankedPrice)。我希望这会导致错误。但它运作良好。为什么会这样?我期待它抛出像C ++或Java这样的变量范围错误,但它不会发生。
select *
from
(select *, RANK() over(order by retailprice) as RankedPrice
from CurrentProducts) as RankedPrice
where RankedPrice = 5
答案 0 :(得分:3)
由于SQL的工作方式,在任何特定的引用中,您都不会对您引用的对象的类型产生任何混淆。
如果您有SELECT a, ...
,则表示a
是对列的引用。它不能是对表,数据库,存储过程,UDF等的引用。(*)
如果您有SELECT a.b, ...
,则表示a
是对表格(+)的引用,而b
是对列的引用。(*)
因此,没有合理的理由阻止表包含表和列具有相同名称的列。
(*) - 这适用于SELECT
子句。在FROM
子句中,单部分名称只能是表(+),两部分名称只能是模式+表等。但在每个子句中,被引用的对象类型始终是毫不含糊的。
(+) - 嗯,这里我真正的意思是一个行源 - 一个表,一个视图,一个CTE。如果你愿意,你可以构建一个表,并在查询中使用它。
正如其他人所说,在子查询中引入相同的别名也没有障碍。但这并没有发生在这里,因为我们最终会得到一个可以(正确地)引用为RankedPrice.RankedPrice
的对象。
答案 1 :(得分:1)
父级和嵌套子查询具有不同的别名命名空间。因此,嵌套子查询可以使用相同的别名,但对于阅读代码的人来说可能有点混乱。
在您的代码中说RankedPrice
首先用作列别名,然后用作派生表别名,尽管前面提到的命名空间解析可以防止任何冲突。
我还应该指出,相关子查询只有一个共享命名空间。