SQL组查询从两个表中获取数据

时间:2013-07-17 04:31:10

标签: mysql sql sql-server sql-server-2008 tsql

我有一个department表和user表,显然每个员工都在不同的部门。
我希望分别获得每个部门的所有用户。我可以按小组或......来做吗?

我的尝试如下,但没有给我预期的结果:

select username,b.deptName
  from user a 
 inner join dept b 
    on a.dept=deptId group by deptName

PS:我需要一个SQL查询来获取不同部门的员工,而不是每个部门都有一个单独的查询!


示例数据

User(Table)

username  dept

John       1
Jack       2    
Sam        1
Tedy       1
Tom        2
Sara       2

dept:(Table)
deptId deptName
1      HR
2      IT

My Desired result:
HR:John-Sam-Tedy
IT:Jack-Tom-Sara

2 个答案:

答案 0 :(得分:5)

单个查询返回单个结果集,而不是单独的结果集。

查询中的GROUP BY将消除大量行。

如果您希望每个部门都有一行,那么您可以使用GROUP_CONCAT功能,尽管它受到一些限制。 (最大长度受max_allowed_packet限制,您需要使用在任何用户名中都不显示为字符的分隔符。

SELECT b.deptName
     , GROUP_CONCAT(a.username ORDER BY a.username ASC SEPARATOR '-') AS usernames
  FROM user a
  JOIN dept b
    ON a.dept=b.deptId
 GROUP BY b.deptName

我建议您在GROUP_CONCAT中包含某种ORDER BY,以便结果具有确定性,并且不会因运行而异。

对于每个用户名,更理想的输出可能是单独的行。您可以使用ORDER BY子句来获取彼此相邻的部门的行。它们不会真正“分开”,但行将被订购。

SELECT b.deptName
     , a.username
  FROM user a
  JOIN dept b
    ON a.dept=b.deptId
 ORDER BY b.deptName, a.username

问:请您解释一下“max_allowed_pa​​cket”是基于字符数或实际大小的限制,如1MB,......?

GROUP_CONCAT()函数返回的字符串长度有限。我认为限制是以字节(而不是字符)指定的,并且是从max_allowed_packet会话变量的当前值派生的。

例如:

SHOW VARIABLES LIKE 'max_allowed_packet';

Variable_name       Value    
------------------  ---------
max_allowed_packet  1048576

所以这意味着GROUP_CONCAT返回的字符串可以超过1MB。

答案 1 :(得分:0)

尝试使用STUFF获得结果。 试试这个

SELECT D.department,
    STUFF((
    SELECT '-'+ U1.userName
    FROM user U1 inner join department D1 ON U1.dept_ID=D1.dept_ID
    WHERE D1.deptName= D.deptName
    FOR XML PATH('')
    )
    ,1,0,'') AS users
FROM user U inner join department D ON U.dept_ID=D.dept_ID
GROUP BY D.deptName