在WHERE或GROUP BY子句中使用列表别名

时间:2010-02-24 14:29:24

标签: sql sql-server group-by alias

我正在编写一个包含SQL的存储过程。在某些列上使用某些函数和GROUP BY子句进行查询。 显然,我必须在GROUP BY中重复这些功能,这会大大降低代码的可读性并增加冗余。

到目前为止,我发现的另一种方法是使用派生查询,这样我就可以从“顶级”查询中访问“二级”查询中定义的别名。 我对此解决方法感到非常满意,因为它增加了代码复杂性(和缩进),我觉得当我可以使用单个数据返回所需的所有数据时,我不应该使用两个查询。

我已经google了一下,我发现这个页面返回了关于子查询的相同提示(+一个关于创建一个视图,但在大多数情况下这是过度的)。

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年仍然应该这样做?

感谢。

匿名。

1 个答案:

答案 0 :(得分:2)

您可以使用CTE(可以嵌套并重复使用):

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中,您可以使用SELECTORDER BYGROUP BY条款中的HAVING列表别名:

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非常好)只是决定他们有更重要的事情需要实现。