关于oracle函数listagg的使用说明

做项目的过程中遇到过一个这样的需求,在“用户查询”前台加一个字段“用户角色”,要将用户的所有角色查询出来放到一个字段中,角色之间用“,”分隔。

发现一个办法是使用Oracle的listagg方法。

[sql] view plain copy
 
  1. WITH TMP AS  
  2.  (SELECT TU.USERNAME, TE.EMP_NAME, TE.EMP_DUTY_NAME, TR.ROLE_NAME  
  3.     FROM TS_USER       TU,  
  4.          TS_USER_ROLE  TUR,  
  5.          TS_ROLE       TR,  
  6.          TM_DEPARTMENT TD,  
  7.          TM_EMPLOYEE   TE  
  8.    WHERE TU.USER_ID = TUR.USER_ID  
  9.      AND TU.EMP_ID = TE.EMP_ID  
  10.      AND TUR.ROLE_ID = TR.ROLE_ID  
  11.      AND TU.DEPT_ID = TD.DEPT_ID  
  12.      AND TD.DEPT_CODE = '755Y'  
  13.    ORDER BY TU.USERNAME ASC)  
  14. SELECT USERNAME 用户名,  
  15.        EMP_NAME 员工姓名,  
  16.        EMP_DUTY_NAME 职位,  
  17.        LISTAGG(ROLE_NAME, ',') WITHIN GROUP(ORDER BY ROLE_NAME) 用户角色  
  18.   FROM TMP  
  19.  GROUP BY USERNAME, EMP_NAME, EMP_DUTY_NAME;  

查询结果:

ID 用户名 用户姓名 职位 角色
1 162 162 保洁员 子系统管理员,调度用户
2 195 195 运作司机 总部质量管理员,普通用户
3 202 202 员工关系中级专员Ⅱ 地区质量管理员
4 7310 ** 质检管理工程师 地区质量界定员
5 124915 ** 调度经理 分点部用户
6 592884 **浩 网络规划初级专员Ⅰ 分点部用户,地区质量界定员,地区质量管理员,普通用户