由于Oracle中的select语句而以逗号分隔的列表

时间:2011-03-16 12:07:00

标签: sql oracle subquery string-aggregation

我有一张名为" person"的表格。它包含人的身份及其父ID(只有一个父亲是可能的)。作为查询的结果,我想要一个包含第一列的表 - 一个人ID,第二列 - 一个包含它的子ID的列表。怎么做到这一点?我已经阅读过listagg函数,但我不确定它是否适合我的目的。 此查询产生一个空的第二列:

选择t1.id, (从人t2中选择t2.id. 其中t2.parent_id = t1.id)来自人t1 其中t1.status =' parent&#39 ;;

4 个答案:

答案 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