4

我有一个名为“人”的表。它包含人的 id 和它的父 id(只有一个父是可能的)。作为查询的结果,我想要一个包含第一列的表 - 一个人 ID,第二列 - 它的子 ID 列表。究竟该怎么做?我已经阅读了 listagg 函数,但我不确定它是否适合我的目的。这个查询产生一个空的第二列:

select t1.id, (select t2.id from person t2 where t2.parent_id = t1.id) from person t1 where t1.status = 'parent';

4

4 回答 4

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
于 2011-03-16T12:43:46.053 回答
1

Mark 的 LISTAGG 实现绝对是 ORacle 11GR2 的必经之路。对于 11GR1 或 Oracle 10,您可以以完全相同的方式使用 wmsys.wm_Concat(可能需要您的 DBA 授予权限)

于 2011-03-16T14:02:31.650 回答
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
;
于 2011-03-16T13:43:32.353 回答
-1

选择 wmsys.wm_concat() FROM ;

这是有争议的,但它有效 - https://forums.oracle.com/forums/thread.jspa?threadID=2205545

于 2013-05-28T14:01:05.573 回答