我对sql中的别名有疑问和疑问。如果我想在同一个查询中使用别名,我可以使用它。例如: 考虑表名为xyz的列a和b
select (a/b) as temp , temp/5 from xyz
这有可能吗?
答案 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;
参考:
答案 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,根据您使用的数据库,它可能是可能的。