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

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

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


person brain_damage    schedule 16.03.2011    source источник
comment
Вы хотите, чтобы в списке были только дети в первом поколении?   -  person Dave Costa    schedule 16.03.2011


Ответы (4)


Реализация LISTAGG Марком определенно подходит для ORacle 11GR2. Для 11GR1 или Oracle 10 вы можете использовать wmsys.wm_Concat точно так же (может потребоваться предоставление разрешений от вашего администратора базы данных)

person Michael Broughton    schedule 16.03.2011

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

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
;
person Dave Costa    schedule 16.03.2011

ВЫБЕРИТЕ wmsys.wm_concat () ОТ;

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

person erichunley    schedule 28.05.2013

person    schedule
comment
согласен с Марком, если вы на 11gr2 ListAgg это то, что вам нужно - person Harrison; 16.03.2011
comment
спасибо, но я думаю, что привел неправильный пример для своего вопроса. Мой вопрос заключался в том, содержит ли строка таблицы идентификатор, номер (каждый дочерний элемент имеет номер своего родителя) и статус (статус может быть дочерним или родительским), как сделать запрос для таблицы с первым столбцом - идентификатором человека и вторым столбцом - список его детей? - person brain_damage; 17.03.2011
comment
@ brain-damage - Теперь ты меня потерял. Два запроса, которые я дал, должны делать именно то, что вы, кажется, спрашиваете ... просто удалите предложение WHERE, которое указывает единственного родителя (вы можете использовать предложение WHERE, где status = 'paerent'). - person Mark Baker; 17.03.2011
comment
Если это не то, что вы хотите, то, возможно, нам поможет пример ваших табличных данных и результаты, которых вы хотите достичь. - person Mark Baker; 17.03.2011