SQL:如何将多行绑定到具有相同id的一行

时间:2012-11-23 11:59:21

标签: sql oracle oracle11g

我有以下查询

select r.role_id, 
r.role_name, 
p.permission_name 
from t_user_role ur, t_role r, t_role_permission rp, t_permission p 
where ur.role_id=r.role_id 
and ur.role_id=rp.role_id 
and rp.permission_id=p.permission_id
and ur.contact_id=505;

给了我以下结果

enter image description here

我想将具有相似行ID的行分组,以获得如下结果:

ROLE_ID                   ROLE_NAME               PERMISSION_NAME   
100                       ops_center               List Dashboard
106                       oc_public                RunETN Activity Detail | Run Test View | .... and so on

请帮助

1 个答案:

答案 0 :(得分:2)

根据您在下面的陈述,我假设您使用的是MySQL并尝试使用GROUP_CONCAT()

  

我尝试过使用群组联系人,但我无法进行查询

如果您使用的是MySQL,那么您将应用GROUP_CONCAT(),如下所示:

select r.role_id, 
  r.role_name, 
  group_concat(p.permission_name separator ' | ') permission_name
from t_user_role ur
inner join t_role r
  on ur.role_id=r.role_id 
inner join t_role_permission rp
  on ur.role_id=rp.role_id 
inner join t_permission p 
  on rp.permission_id=p.permission_id
where ur.contact_id=505
group by r.role_id, r.role_name;

注意:我更改了查询以使用ANSI JOIN语法而不是以逗号分隔的表列表

在Oracle 11g中,您可以使用LISTAGG()

select r.role_id, 
  r.role_name, 
  LISTAGG(p.permission_name, ' | ') WITHIN GROUP (ORDER BY r.role_id) permission_name
from t_user_role ur
inner join t_role r
  on ur.role_id=r.role_id 
inner join t_role_permission rp
  on ur.role_id=rp.role_id 
inner join t_permission p 
  on rp.permission_id=p.permission_id
where ur.contact_id=505
group by r.role_id, r.role_name;