Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL查询中多次使用别名?_Sql_Alias - Fatal编程技术网

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

在SQL查询中多次使用别名?,sql,alias,Sql,Alias,我在查询中使用同一别名(RankedPrice)两次。我以为那会引起一个错误。但效果很好。为什么会发生这种情况?我希望它会像C++或java一样抛出一个可变范围错误,但是它不会发生。 select * from (select *, RANK() over(order by retailprice) as RankedPrice from CurrentProducts) as RankedPrice where RankedPrice = 5 父查询和嵌套子查询具有不同的别名命名空间。因此,

我在查询中使用同一别名(RankedPrice)两次。我以为那会引起一个错误。但效果很好。为什么会发生这种情况?我希望它会像C++或java一样抛出一个可变范围错误,但是它不会发生。
select *
from
(select *, RANK() over(order by retailprice) as RankedPrice
from CurrentProducts) as RankedPrice
where RankedPrice = 5

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

您的代码
RankedPrice
中所述的名称首先用作列别名,然后用作派生表别名,尽管前面提到的名称空间sepreration可以防止任何冲突


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

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

您的代码
RankedPrice
中所述的名称首先用作列别名,然后用作派生表别名,尽管前面提到的名称空间sepreration可以防止任何冲突


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

由于SQL的工作方式,您永远不会对在任何特定引用中引用的对象类型有任何混淆

如果您选择了一个,…,您就知道
a
是对列的引用。它不能是对表、数据库、存储过程、UDF等的引用(*)

如果您有
SELECT a.b,…
,您就知道
a
是对表(+)的引用,
b
是对列的引用。(*)

因此,没有逻辑上的理由阻止表包含表和列都具有相同名称的列


(*)-这适用于
SELECT
子句。在
FROM
子句中,单个部分名称只能是表(+),两部分名称只能是架构+表等。但在每个子句中,所引用对象的类型始终是明确的

(+)-我这里真正的意思是一个行源-一个表,一个视图,一个CTE。如果需要,可以将其构造为表并在查询中使用



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

由于SQL的工作方式,在任何特定的引用中,您永远不会对引用的对象类型有任何混淆

如果您选择了一个,…,您就知道
a
是对列的引用。它不能是对表、数据库、存储过程、UDF等的引用(*)

如果您有
SELECT a.b,…
,您就知道
a
是对表(+)的引用,
b
是对列的引用。(*)

因此,没有逻辑上的理由阻止表包含表和列都具有相同名称的列


(*)-这适用于
SELECT
子句。在
FROM
子句中,单个部分名称只能是表(+),两部分名称只能是架构+表等。但在每个子句中,所引用对象的类型始终是明确的

(+)-我这里真正的意思是一个行源-一个表,一个视图,一个CTE。如果需要,可以将其构造为表并在查询中使用



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

一个是表别名,另一个是列别名一个是表别名,另一个是列别名