2010-02-24 67 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