在查询中使用别名并使用它

Using alias in query and using it

提问人:asb 提问时间:1/13/2010 最后编辑:Filip Ekbergasb 更新时间:12/8/2022 访问量:48819

问:

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

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

这在某种程度上可能吗?

SQL 别名

评论


答:

-3赞 Filip Ekberg 1/13/2010 #1

您可能会发现 W3Schools“SQL 别名”很有帮助。

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

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

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

23赞 Josh 1/13/2010 #2

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

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

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

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

在MSSQL中,您还可以选择创建计算列,这些列在表架构中指定,而不是在查询中指定。

评论

0赞 Joseph Cho 3/22/2019
这是否也是 CROSS APPLY 的情况?
3赞 onedaywhen 1/13/2010 #3

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

子句中的表达式(及其相关名称)“同时”存在;没有你所希望的从左到右的评估。SELECT

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

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

7赞 Guru 1/13/2010 #4

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

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

这具有性能优势,尤其是在具有涉及多个嵌套查询的复杂查询时,因为 WITH 语句仅计算一次并在后续语句中使用。

1赞 Chris 10/7/2014 #5

我猜这是可能的:

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);
1赞 Jebil 8/1/2019 #6

此功能现已在 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/