由于Oracle中的SELECT语句导致的逗号分隔列表
我有一个名为“person”的表。它包含个人的ID和它的父母身份(只有一个父母是可能的)。作为查询的结果,我想要一个带有第一列的表格 - 一个人员ID,第二列 - 它的孩子ID列表。如何做到这一点?我已阅读了关于listagg函数,但我不确定它是否适合我的目的。 而这个查询产生一个空的第二列:由于Oracle中的SELECT语句导致的逗号分隔列表
选择t1.id, 从人T1 (来自人T2 其中t2.parent_id = t1.id选择t2.id)其中t1.status = '父' ;
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
同意马克,如果你在11gr2 ListAgg是你想要的 – Harrison 2011-03-16 12:50:38
谢谢,但我认为我给了我的问题一个错误的例子。我的问题是,如果一个表行包含ID,数字(每个孩子都有其父母的编号)和状态(状态可以是孩子或父母),如何查询第一列的表 - 一个人的ID和第二列 - 它的孩子ID的列表? – 2011-03-17 07:12:43
@脑损伤 - 你现在失去了我。我给出的两个查询都应该完全按照您似乎要求的方式执行......只是删除指定单个父项的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
希望只第一代的孩子在列表中? – 2011-03-16 12:40:30
是的,只有第一个 – 2011-03-16 20:43:36