在 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】:

你可以使用CTEs(可以嵌套重复使用):

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 BYGROUP BYHAVING 子句中使用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 以对嵌套查询处理不佳而闻名,因此这种能力对性能至关重要。

很可能其他系统(可以很好地处理嵌套查询和CTEs)只是决定他们有更重要的事情要实现。

【讨论】:

如果派生表解决方案已经绊倒了 OP,这很可能会。

以上是关于在 WHERE 或 GROUP BY 子句中使用列表别名的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server报错:选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

group by 列 聚合函数 where having

group by 列 聚合函数 where having

Group by

SQL语句中,为啥where子句不能使用列别名,而order by却可以?

SQL CE 4 错误:ntext 和 image 数据类型不能在 WHERE、HAVING、GROUP BY、ON 或 IN 子句中使用