这个问题在这里已经有一个答案:

我有一张名为“人”的桌子。它包含人的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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top