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

时间:2010-01-13 07:35:44

标签: sql alias

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

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

这有可能吗?

6 个答案:

答案 0 :(得分:12)

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

这在Microsoft SQL Server中是不可能的,几乎所有的SQL经验都限于此。但是你可以做到以下几点。

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

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

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

答案 1 :(得分:5)

您也可以使用Oracle with语句。其他DB也有类似的声明。这是我们用于Oracle的那个。

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

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

答案 2 :(得分:2)

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

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

根据@Josh Einstein在这里的回答,您可以使用派生表作为解决方法(希望使用mote有意义的名称而不是'temp'并为temp/5表达提供一个 - 请记住那个人将继承你的代码。)

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

答案 3 :(得分: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);

答案 4 :(得分:0)

现在在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/

答案 5 :(得分:-2)

您可能会发现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'

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