我有一张名为" person"的表格。它包含人的身份及其父ID(只有一个父亲是可能的)。作为查询的结果,我想要一个包含第一列的表 - 一个人ID,第二列 - 一个包含它的子ID的列表。怎么做到这一点?我已经阅读过listagg函数,但我不确定它是否适合我的目的。 此查询产生一个空的第二列:
选择t1.id, (从人t2中选择t2.id. 其中t2.parent_id = t1.id)来自人t1 其中t1.status =' parent&#39 ;;
答案 0 :(得分:8)
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
答案 1 :(得分:1)
Mark的LISTAGG实现绝对是ORacle 11GR2的实现方式。对于For 11GR1或Oracle 10,您可以以完全相同的方式使用wmsys.wm_Concat(可能需要DBA的权限授予)
答案 2 :(得分:0)
另一种接近它的方法......
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
;
答案 3 :(得分:-1)
SELECT wmsys.wm_concat() 来自;
这是有争议的,但它有效 - https://forums.oracle.com/forums/thread.jspa?threadID=2205545