Разделенный запятыми список в результате оператора выбора в Oracle
У меня есть таблица с именем "человек". Он содержит идентификатор человека и его родительский идентификатор (возможен только один родительский). В результате запроса мне нужна таблица с первым столбцом - идентификатором человека, а второй столбец - списком его дочерних идентификаторов. Как именно это сделать? Я читал о функции listagg, но я не уверен, подходит ли она для моих целей. И этот запрос создает пустой второй столбец:
выберите t1.id, (выберите t2.id от лица t2, где t2.parent_id = t1.id) от лица t1, где t1.status = 'parent';
4 ответа
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
Реализация LISTAGG Марком определенно является подходом для ORacle 11GR2. Для 11GR1 или Oracle 10 вы можете использовать вместо него wmsys.wm_Concat точно таким же образом (может потребоваться предоставление разрешений от вашего администратора БД)
Просто еще один способ приблизиться к этому...
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() FROM;
Это спорно, но это работает - https://forums.oracle.com/forums/thread.jspa?threadID=2205545