关于oracle函数listagg的使用说明

时间:2023-03-09 08:44:28
关于oracle函数listagg的使用说明

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

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

  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 **浩 网络规划初级专员Ⅰ 分点部用户,地区质量界定员,地区质量管理员,普通用户