在 WHERE 或 GROUP BY 子句中使用列表别名
Posted
技术标签:
【中文标题】在 WHERE 或 GROUP BY 子句中使用列表别名【英文标题】:Using list alias in WHERE or GROUP BY clause 【发布时间】:2010-02-24 14:29:24 【问题描述】:我正在编写一个包含 SQL Select 查询的存储过程,该查询在某些列上具有一些函数和一个 GROUP BY 子句。 显然,我必须在 GROUP BY 中重复这些函数,这会大大降低代码的可读性并增加冗余。
到目前为止,我发现的另一种方法是使用派生查询,这样我就可以从“***”查询访问“二级”查询中定义的别名。 我对这种解决方法感到相当满意,因为它增加了代码复杂性(和缩进),而且我觉得当我可以使用一个查询返回所有我想要的数据时,我不应该使用两个查询。
我用谷歌搜索了一下,发现这个页面返回了关于子查询的相同提示(+ 一个关于创建视图的提示,但在大多数情况下这太过分了)。
http://databases.aspfaq.com/database/how-do-i-use-a-select-list-alias-in-the-where-or-group-by-clause.html
我不敢相信,在 2010 年,没有其他方法,尤其是多年来一直关注代码可重用性和可读性:有人有我从未听说过的优雅技巧吗? (对于 SQL Server 2005/2008),或者对为什么在 2010 年仍应以这种方式进行有根据的猜测?
谢谢。
匿名。
【问题讨论】:
对于 SQL,无论缩进有多“漂亮”或重复琐碎的代码行多少次,都使用构建最佳执行计划并因此运行速度最快的代码.很多时候,“漂亮”的查询会极大地影响它的速度和性能。 【参考方案1】:你可以使用CTE
s(可以嵌套重复使用):
WITH sub AS
(
SELECT *, LastName + ', ' + FirstName AS FullName
FROM Employees
),
moresub AS
(
SELECT *, Title + ' ' + FullName AS TitledName
FROM sub
)
SELECT FullName
FROM moresub
WHERE moresub.TitledName = 'Mr. Bertrand, Aaron'
UNION ALL
SELECT FullName
FROM moresub
WHERE moresub.FullName = 'Doe, John'
更新:
看来我误解了你的问题。
在mysql
中,您可以在ORDER BY
、GROUP BY
和HAVING
子句中使用SELECT
列表别名:
SELECT id + 1 AS myalias
FROM (
SELECT 1 AS id
UNION ALL
SELECT 2 AS id
) q
GROUP BY
myalias
HAVING myalias <= 3
ORDER BY
myalias DESC
,但 MySQL
以对嵌套查询处理不佳而闻名,因此这种能力对性能至关重要。
很可能其他系统(可以很好地处理嵌套查询和CTE
s)只是决定他们有更重要的事情要实现。
【讨论】:
如果派生表解决方案已经绊倒了 OP,这很可能会。以上是关于在 WHERE 或 GROUP BY 子句中使用列表别名的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server报错:选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中
SQL语句中,为啥where子句不能使用列别名,而order by却可以?
SQL CE 4 错误:ntext 和 image 数据类型不能在 WHERE、HAVING、GROUP BY、ON 或 IN 子句中使用