2012-05-24 32 views
4

鑑於以下select語句:T-SQL - 必須具備通過團體定期或聚合函數選擇

Select t.name, SUM(st.row_count) as row_count 
From sys.dm_db_partition_stats st 
join sys.tables t on t.object_id = st.object_id 
join ClientUpdateConfig c on t.name = c.TableName 
Where (index_id < 2) and schema_id = schema_id('dbo') 
and t.type ='U' 
group by t.name 

我也想選擇c.RowID作爲附加字段。該查詢工作,因爲它是,但如果我變了樣1:

Select t.name, SUM(st.row_count) as row_count, c.RowID as current_row 

我得到的錯誤:

Msg 8120, Level 16, State 1, Line 1 Column 'ClientUpdateConfig.RowID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

有人能解釋爲什麼我需要在聚合函數的選擇值(我假設SUM)還是在組中選擇它?我不明白這個限制 - 如果我能理解爲什麼會發生這種情況,也許我可以調整我的查詢設計。

+0

你不能添加'GROUP BY t.name,c.RowID'嗎?錯誤信息是不言自明的。如果選擇列表中的任何內容不是聚合,則還必須考慮GROUP BY。如果有重複的RowID並且只需要一個,則需要告訴SQL Server要使用哪一個(通常爲MIN或MAX)。 –

+1

人們獲取關係數據庫最困難的事情之一就是聚合。 @ W00te,當您使用「GROUP BY」時,您正在爲每個輸出行選擇多個源行。你需要指定你想要哪個'RowId',因爲每個輸出行會有多個'RowID'值。 – JNK

+0

謝謝指點。這是我經歷過幾次的那些事情之一,但是它總是在一年之間,因爲我只能在數據庫中進行非正常工作。它總是回來咬我:) –

回答

7

因爲它不知道選擇哪個RowId。

您需要用:

. . . 
group by t.name, RowId 

或:

select . . ., min(RowId) -- or max(RowId) 

即使你知道,每名只有一個RowId的,數據庫不知道,所以你必須明確地說,你想在查詢中做什麼。

+1

這兩個選項之間有任何性能差異? min()vs group by – VSP

+0

@ ase69s我想知道同樣的 - 你有答案嗎? – gotqn

+0

@ ase69s。 。 。奇怪的問題。 'min()'和'group by'都做聚合,所以他們應該有相似的表現。 –

1

查詢結果基於多個ROWS的聚合。您使用相同的t.name以及它們的許多不同的st.row_count值執行多行,並創建一行(其中t.name對於每個彙總行都是相同的,並且它們的所有值的總和都是t.row_count)。對於這樣的總和,沒有合理的價值c.Row_ID。您分組的每一行都有不同的值,因此無法確定應使用的值。如果RowID是數字,則可以對所有ID進行平均或求和或可能取最小(最小)或最大(最大)。不是說會有什麼意義。像這樣的值只會存在於一個聚合中。

+0

+1,感謝您的解釋,它幫助了很多。 –

相關問題