Список, разделенный запятыми, в результате оператора SELECT в Oracle [Duplicate

StackOverflow https://stackoverflow.com/questions/5324996

Вопрос

У меня есть таблица под названием «Человек». Он содержит идентификатор человека и его родительский идентификатор (возможно только один из родителей). В результате запроса я хочу таблицу с первым столбцом - идентификатором человека и вторым столбцом - списком идентификаторов его детей. Как именно это сделать? Я читал о функции Listagg, но я не уверен, подходит ли это для моей цели. И этот запрос создает пустой второй столбец:

Выберите t1.id, (выберите t2.id из человека t2, где t2.parent_id = t1.id) из человека t1, где t1.status = 'parent';

Это было полезно?

Решение

SELECT parent_id,
       RTRIM(XMLAGG(XMLELEMENT(e,child_id || ',')).EXTRACT('//text()'),',') AS "Children"
  FROM parentChildTable
 WHERE parent_id = 0
 GROUP BY parent_id

или же

SELECT parent_id,
       LISTAGG(child_id, ',') WITHIN GROUP (ORDER BY child_id) AS "Children"
  FROM parentChildTable
 WHERE parent_id = 0
 GROUP BY parent_id

Другие советы

Реализация Марка в Листагг определенно способ пойти на Oracle 11gr2. Для 11gr1 или Oracle 10 вы можете использовать wmsys.wm_concat вместо этого точно так же (может потребовать предоставления разрешений от вашего DBA)

Просто еще один способ подойти к нему ...

SELECT parent_id,max(child_list) FROM (
  SELECT parent_id,sys_connect_by_path(child_number,',') child_list FROM (
    SELECT parent_id, id,
           row_number() over (partition by parent_id order by id) child_number
      FROM person
      WHERE parent_id IS NOT NULL
  )
  START WITH child_number=1
  CONNECT BY parent_id = PRIOR parent_id AND child_number = PRIOR child_number + 1
)
GROUP BY parent_id
ORDER BY parent_id
;

Выберите wmsys.wm_concat () из;

Это спорно, но это работает - https://forums.oracle.com/forums/thread.jspa?threadid=2205545

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top