2013-07-31 56 views
2

當我在MS SQL Management Studio中執行以下查詢時,它產生了一個錯誤。爲什麼不能在此查詢中使用GROUP BY

查詢:

select u.UserName, r.RoleName 
from User u 
join UserRole ur on ur.UserId = u.UserId 
join Role r on r.RoleId = ur.RoleId 
group by r.RoleName 

錯誤:

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

它被我曾使用SQL一段時間,這個我認爲是一些基本的命令。但我仍然無法弄清楚原因。

注:

有沒有錯誤,如果我用

group by r.RoleName, u.UserName

+2

什麼是你想獲得的結果呢?如果按「RoleName」分組,則每個角色都會得到一行 - 而且一個角色可能包含很多用戶 - 因此,選擇「userName」是無效的。 –

回答

4

這表明single-value rule,禁止當你運行一個GROUP BY查詢您得到未定義的結果,並且您在選擇列表中是的分組標準既不一部分的任何列,也沒有出現在聚合函數(SUM, MIN, MAX, etc.)。希望你明白。

Group By

我不知道,但可能你希望這個..

select distinct u.UserName, r.RoleName 
from User u 
join UserRole ur on ur.UserId = u.UserId 
join Role r on r.RoleId = ur.RoleId 
1

GROUP BY語句用於結合合計函數組的結果集由一個或多個列。

select u.UserName, r.RoleName 
from User u 
join UserRole ur on ur.UserId = u.UserId 
join Role r on r.RoleId = ur.RoleId 
group by u.UserName,r.RoleName 

group by用於聚合函數或過濾重複項。在sql-server組中,除了需要集合函數之外,還需要選擇所有列。

在mysql的情況下,下面的查詢不會拋出錯誤。它將爲每個項目在group by子句中選擇第一行。

select u.UserName, r.RoleName 
    from User u 
    join UserRole ur on ur.UserId = u.UserId 
    join Role r on r.RoleId = ur.RoleId 
    group by r.RoleName 
+3

爲什麼你將'r.RoleName'分組兩次? – Nikola

+0

@Nikola我的錯誤。更新。謝謝你的收穫。 –

+0

@PraveenPrasannan我已經在我的問題中提供了這個。我不是在尋找解決方案。我的第一個查詢不起作用的原因是我需要的。 –