在SQL查询中多次使用别名?

时间:2013-01-13 07:57:14

标签: sql alias

我在查询中使用了两次相同的别名(RankedPrice)。我希望这会导致错误。但它运作良好。为什么会这样?我期待它抛出像C ++或Java这样的变量范围错误,但它不会发生。

select *
from
(select *, RANK() over(order by retailprice) as RankedPrice
from CurrentProducts) as RankedPrice
where RankedPrice = 5

2 个答案:

答案 0 :(得分:3)

由于SQL的工作方式,在任何特定的引用中,您都不会对您引用的对象的类型产生任何混淆。

如果您有SELECT a, ...,则表示a是对列的引用。它不能是对表,数据库,存储过程,UDF等的引用。(*)

如果您有SELECT a.b, ...,则表示a是对表格(+)的引用,而b是对列的引用。(*)

因此,没有合理的理由阻止表包含表和列具有相同名称的列。


(*) - 这适用于SELECT子句。在FROM子句中,单部分名称只能是表(+),两部分名称只能是模式+表等。但在每个子句中,被引用的对象类型始终是毫不含糊的。

(+) - 嗯,这里我真正的意思是一个行源 - 一个表,一个视图,一个CTE。如果你愿意,你可以构建一个表,并在查询中使用它。


正如其他人所说,在子查询中引入相同的别名也没有障碍。但这并没有发生在这里,因为我们最终会得到一个可以(正确地)引用为RankedPrice.RankedPrice的对象。

答案 1 :(得分:1)

父级和嵌套子查询具有不同的别名命名空间。因此,嵌套子查询可以使用相同的别名,但对于阅读代码的人来说可能有点混乱。

在您的代码中说RankedPrice首先用作列别名,然后用作派生表别名,尽管前面提到的命名空间解析可以防止任何冲突。

我还应该指出,相关子查询只有一个共享命名空间。