25

我对 sql 中的别名有疑问和疑问。如果我想在同一个查询中使用别名,我可以使用它。例如:考虑具有列 a 和 b 的表名 xyz

select (a/b) as temp , temp/5 from xyz

这在某种程度上可能吗?

4

6 回答 6

21

您正在谈论为查询中的表达式提供标识符,然后在查询的其他部分重用该标识符?

这在 Microsoft SQL Server 中是不可能的,我几乎所有的 SQL 经验都仅限于此。但是,您可以执行以下操作。

SELECT temp, temp / 5
FROM (
    SELECT (a/b) AS temp
    FROM xyz
) AS T1

显然,该示例并不是特别有用,但如果您在多个地方使用该表达式,它可能会更有用。当表达式很长并且您也想对它们进行分组时,它可以派上用场,因为 GROUP BY 子句要求您重新声明表达式。

在 MSSQL 中,您还可以选择创建在表模式中而不是在查询中指定的计算列。

于 2010-01-13T07:41:38.850 回答
6

您也可以使用 Oraclewith语句。其他数据库中也有类似的语句。这是我们用于 Oracle 的。

with t
as (select a/b as temp
from xyz)
select temp, temp/5
from t
/

这具有性能优势,特别是当您有一个涉及多个嵌套查询的复杂查询时,因为WITH语句只评估一次并在后续语句中使用。

于 2010-01-13T10:02:38.400 回答
2

SELECT假设您的 SQL 产品符合入门级标准 SQL-92,则在同一子句中是不可能的。

SELECT子句中的表达式(及其相关名称) “一次性”出现;似乎没有您希望的从左到右的评估。

根据@Josh Einstein 在此处的回答,您可以使用派生表作为解决方法(希望使用比“temp”更有意义的名称并为temp/5表达式提供一个名称——记住将继承您的代码的人)。

请注意,您发布的代码可以在 MS Access 数据库引擎上运行(并且会为Expr1您的第二个表达式分配一个无意义的相关名称),但它又不是真正的 SQL 产品。

于 2010-01-13T09:34:40.500 回答
1

我猜它可能:

SELECT (A/B) as temp, (temp/5)
FROM xyz, 
(SELECT numerator_field as A, Denominator_field as B FROM xyz), 
(SELECT (numerator_field/denominator_field) as temp FROM xyz);
于 2014-10-07T11:38:18.630 回答
1

这现在在 Amazon Redshift 中可用

例如

select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;

参考:

https://aws.amazon.com/about-aws/whats-new/2018/08/amazon-redshift-announces-support-for-lateral-column-alias-reference/

于 2019-08-01T08:32:18.450 回答
-3

您可能会发现W3Schools “SQL Alias” 很有帮助

这是他们教程中的一个示例:

SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p,
Product_Orders AS po
WHERE p.LastName='Hansen' AND p.FirstName='Ola'

关于在查询中进一步使用别名,根据您使用的数据库,它可能是可能的。

于 2010-01-13T07:36:58.407 回答