由于Oracle中的SELECT语句导致的逗号分隔列表

问题描述:

我有一个名为“person”的表。它包含个人的ID和它的父母身份(只有一个父母是可能的)。作为查询的结果,我想要一个带有第一列的表格 - 一个人员ID,第二列 - 它的孩子ID列表。如何做到这一点?我已阅读了关于listagg函数,但我不确定它是否适合我的目的。 而这个查询产生一个空的第二列:由于Oracle中的SELECT语句导致的逗号分隔列表

选择t1.id, 从人T1 (来自人T2 其中t2.parent_id = t1.id选择t2.id)其中t1.status = '父' ;

+1

希望只第一代的孩子在列表中? – 2011-03-16 12:40:30

+0

是的,只有第一个 – 2011-03-16 20:43:36

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

同意马克,如果你在11gr2 ListAgg是你想要的 – Harrison 2011-03-16 12:50:38

+0

谢谢,但我认为我给了我的问题一个错误的例子。我的问题是,如果一个表行包含ID,数字(每个孩子都有其父母的编号)和状态(状态可以是孩子或父母),如何查询第一列的表 - 一个人的ID和第二列 - 它的孩子ID的列表? – 2011-03-17 07:12:43

+0

@脑损伤 - 你现在失去了我。我给出的两个查询都应该完全按照您似乎要求的方式执行......只是删除指定单个父项的WHERE子句(您可能希望使用WHERE子句,其中status ='paerent')。 – 2011-03-17 08:35:36

只是另一种方式接近它...

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 
; 

马克的实施LISTAGG的肯定是要走对于Oracle 11gR2的方式。对于11GR1或Oracle 10,您可以使用wmsys.wm_Concat完全相同的方式(可能需要从您的DBA获得权限授予)

SELECT wmsys.wm_concat() FROM;

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