提问人:asb 提问时间:1/13/2010 最后编辑:Filip Ekbergasb 更新时间:12/8/2022 访问量:48819
在查询中使用别名并使用它
Using alias in query and using it
问:
我对 sql 中的别名有疑问和疑问。如果我想在同一个查询中使用别名,我可以使用它吗?例如: 考虑包含列 a 和 b 的表名 xyz
select (a/b) as temp , temp/5 from xyz
这在某种程度上可能吗?
答:
您可能会发现 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'
关于在查询中进一步使用别名,根据您使用的数据库,这可能是可能的。
您说的是为查询中的表达式提供标识符,然后在查询的其他部分重用该标识符?
这在 Microsoft SQL Server 中是不可能的,我几乎所有的 SQL 经验都仅限于此。但是,您可以执行以下操作。
SELECT temp, temp / 5
FROM (
SELECT (a/b) AS temp
FROM xyz
) AS T1
显然,这个例子不是特别有用,但如果你在几个地方使用这个表达式,它可能更有用。当表达式很长并且您也想对它们进行分组时,它会派上用场,因为 GROUP BY 子句要求您重新声明表达式。
在MSSQL中,您还可以选择创建计算列,这些列在表架构中指定,而不是在查询中指定。
评论
假设您的 SQL 产品符合入门级标准 SQL-92,则在同一子句中是不可能的。SELECT
子句中的表达式(及其相关名称)“同时”存在;没有你所希望的从左到右的评估。SELECT
根据 @Josh Einstein 的回答,您可以使用派生表作为解决方法(希望使用比“temp”更有意义的名称,并为表达式提供一个名称 - 请记住将继承您的代码的人)。temp/5
请注意,您发布的代码可以在 MS Access 数据库引擎上运行(并且会为您的第二个表达式分配一个无意义的相关名称),但话又说回来,它不是真正的 SQL 产品。Expr1
您也可以使用 Oracle 语句。其他数据库中也有类似的语句。这是我们用于 Oracle 的那个。with
with t
as (select a/b as temp
from xyz)
select temp, temp/5
from t
/
这具有性能优势,尤其是在具有涉及多个嵌套查询的复杂查询时,因为 WITH
语句仅计算一次并在后续语句中使用。
我猜这是可能的:
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);
此功能现已在 Amazon Redshift 中提供
例如
select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;
裁判:
评论