2013-07-31 55 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我已经在我的问题中提供了这个。我不是在寻找解决方案。我的第一个查询不起作用的原因是我需要的。 –