关于oracle函数listagg的使用说明

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

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

WITH TMP AS
 (SELECT TU.USERNAME, TE.EMP_NAME, TE.EMP_DUTY_NAME, TR.ROLE_NAME
    FROM TS_USER       TU,
         TS_USER_ROLE  TUR,
         TS_ROLE       TR,
         TM_DEPARTMENT TD,
         TM_EMPLOYEE   TE
   WHERE TU.USER_ID = TUR.USER_ID
     AND TU.EMP_ID = TE.EMP_ID
     AND TUR.ROLE_ID = TR.ROLE_ID
     AND TU.DEPT_ID = TD.DEPT_ID
     AND TD.DEPT_CODE = '755Y'
   ORDER BY TU.USERNAME ASC)
SELECT USERNAME 用户名,
       EMP_NAME 员工姓名,
       EMP_DUTY_NAME 职位,
       LISTAGG(ROLE_NAME, ',') WITHIN GROUP(ORDER BY ROLE_NAME) 用户角色
  FROM TMP
 GROUP BY USERNAME, EMP_NAME, EMP_DUTY_NAME;
查询结果:

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



你可能感兴趣的:(Oracle)