根据Oracle中的SELECT语句[重复]的逗号分隔列表
-
25-10-2019 - |
题
这个问题在这里已经有一个答案:
我有一张名为“人”的桌子。它包含人的ID,并且是父ID(只有一个父母)。由于查询的结果,我想要一张具有第一列的表格 - 一个人ID和第二列 - 它的儿童ID列表。到底该怎么做?我已经阅读了有关ListAgg功能的信息,但是我不确定是否适合我的目的。此查询产生了一个空的第二列:
从人t1中选择t2.id t2的t1.id,(从t2中选择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
其他提示
Mark的Listagg实现绝对是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
不隶属于 StackOverflow