Как преобразовать многострочные значения в одну строку с разными значениями, разделенными запятыми, в Oracle - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь вернуть данные в разделенных запятыми значениях с помощью запроса ниже.

select u.employeeid,
       ( select name
         from   roles r
         where  r.id = ur.role_id
       ) userrole
from   users u,
       user_role ur
where  u.id in (select DISTINCT ur.user_id
                from user_role ur)
order by u.employeeid asc;

Текущий вывод:

EMPLOYEEID USERRROLE
---------------------
1000    ROLE_SUPER_ADMIN
1000    ONBOARDING_CHECKER
1000    ROLE_SUPER_ADMIN
1000    ROLE_APPROVER
1000    ROLE_ONBORDING

Теперь, когда я выполняю запрос, я хочу, чтобы таблица былакак:

EMPLOYEEID USERRROLE
--------------------
1000       ROLE_SUPER_ADMIN,ONBOARDING_CHECKER,ROLE_SUPER_ADMIN,ROLE_APPROVER,ROLE_ONBORDING

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Используйте LISTAGG (и соединения ANSI, а не унаследованные запятые и запутанные подзапросы). Что вы, вероятно, хотите:

SELECT u.employeeid,
       LISTAGG( r.name, ',' ) WITHIN GROUP ( ORDER BY r.name ) AS userrole
FROM   users u
       INNER JOIN user_role ur
       ON ( u.id = ur.user_id )
       LEFT OUTER JOIN roles r
       ON ( r.id = ur.role_id )
GROUP BY u.employeeid
ORDER BY u.employeeid asc;

Хотя я думаю, что вы на самом деле написали бы:

SELECT u.employeeid,
       LISTAGG( r.name, ',' ) WITHIN GROUP ( ORDER BY r.name ) AS userrole
FROM   users u
       CROSS JOIN user_role ur
       LEFT OUTER JOIN roles r
       ON ( r.id = ur.role_id )
WHERE  EXISTS ( SELECT 1
                FROM   user_roles x
                WHERE  u.id = x.user_id )
GROUP BY u.employeeid
ORDER BY u.employeeid asc;
0 голосов
/ 04 октября 2019

это будет делать:

SELECT LISTAGG("USERRROLE", ',') WITHIN GROUP (ORDER BY "USERRROLE")
FROM Table1 group by "EMPLOYEEID";

проверить скрипку: http://sqlfiddle.com/#!4/d11c6/4

Спасибо !!!!!!!

...