2010-02-24 152 views
2

我正在编写一个存储过程,它包含一些列上有一些函数的SQL Select查询和一个GROUP BY子句。 显然,我必须在GROUP BY中重复这些函数,这会显着降低代码可读性并增加冗余。在WHERE或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

关于SQL,请使用构建最佳执行计划并以最快速度运行的代码,而不管缩进程度如何“漂亮”或重复多少次代码。很多时候,“漂亮”的查询会严重影响速度和性能。 – 2010-02-24 14:54:17

回答

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,您可以在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用于处理不当嵌套查询的是已知的,所以这才是对性能至关重要。

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

+1

如果派生表解决方案已经跳出OP,这很可能会。 – 2010-02-24 14:37:41