2009-10-19 164 views
3

是否可以縮短group by子句,以便您不必重複select子句中提到的字段ad nauseam?例如:縮短GROUP BY子句

SELECT 
    field1, 
    field2, 
    field3, 
    field4 
FROM table 
GROUP BY 
    field1, 
    field2, 
    field3, 
    field4 

to: 

SELECT 
field1, 
field2, 
field3, 
field4 
FROM table 
GROUP BY 
SELECT.* 

...或這個效果。我正在編寫一個將使用sp_executesql()存儲過程的查詢,並且我的變量中可用空間不足。非常感謝。

回答

11

你在尋找SELECT DISTINCT or SELECT DISTINCTROW

+1

Crud。是的,那裏有一個腦袋。完全忘記了獨特。謝謝。 – DaWolfman 2009-10-19 14:06:40

+0

我投了棄權票,然後意識到DISTINCT回答了他實際問到的問題。抱歉。 – 2009-10-19 14:13:18

8
SELECT 
    field1, 
    field2, 
    field3, 
    field4 
FROM table 
GROUP BY 1,2,3,4 

其中數字表示選擇部分中的柱位置。

+0

+1 - 偉大的捷徑! – 2009-10-19 14:05:11

+0

不知道。謝謝你的提示! – DaWolfman 2009-10-19 14:09:13

+0

不錯的一個:)今天學到了一些新東西 – knittl 2009-10-19 14:09:30

0

他們是兩個不同的概念:

  • SELECT =輸出
  • GROUP BY =什麼聚集在

現在,每個選定條目,必須綜合或GROUP BY。通常,GROUP BY也有更多列,即SELECT。

但是,我懷疑你是聚合太多/太晚。您可以使用派生表或CTE來「更早」地完成任務。

SELECT 
    T1.field1, T1.field2, foo.field3, foo.field4, foo.AggField5 
FROM 
    table T1 
    JOIN 
    (SELECT 
     T2.keycol, T2.field3, T2.field4, SUM(T2.field5) AS AggField5 
    FROM 
     table T2 
    GROUP BY 
     T2.keycolT2.field3, T2.field4 
    ) foo ON T1.Keycol = foo.keycol 

在你的榜樣,雖然,使用DISTINCT沒有GROUP BY ...

1

有DISTINCT和GROUP BY之間的顯著差異。在簡單的查詢中,它們可能是相同的,儘管GROUP BY允許聚合。

但除了這一點,DISTINCT將制定出每場做DISTINCT之前,即使是同一領域的確定性的用途(例如,起始日期和DATEADD(天,1,起始日期) - 檢查執行計劃,你會發現DATEADD是在DISTINCT之前完成的,因此GROUP BY幾乎總是更好。

但是......值得注意的是,只要GROUP BY包含某個唯一索引它(例如主鍵),該表中的任何其他項都將被忽略。畢竟,通過在GROUP BY子句中包含其他字段,您將無法獲得更多唯一性。那麼,爲什麼不採取的做法:

GROUP BY t.id, u.id 
/* All these other fields are ignored but here because they're 
    in the HAVING/SELECT/ORDER BY clauses 
*/ 
, t.TransactionValue, u.Username, .... 

我得到你仍然不必鍵入這一切,它會是不錯的GROUP BY t.*,但如果你想,你可以讓微軟通過投票表決知道at https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=124654