【问题标题】:comma-separated list as a result of select statement in Oracle [duplicate]逗号分隔的列表作为 Oracle 中选择语句的结果 [重复]
【发布时间】:2011-07-16 13:11:27
【问题描述】:

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

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

【问题讨论】:

  • 您只想要列表中的第一代孩子?

标签: sql oracle subquery string-aggregation


【解决方案1】:

选择 wmsys.wm_concat() 来自 ;

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      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
      ;
      

      【讨论】:

        【解决方案4】:
        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,如果你在 11gr2 ListAgg 就是你想要的
        • 谢谢,但我认为我为我的问题举了一个错误的例子。我的问题是,如果一个表行包含 id、数字(每个孩子都有其父母的号码)和状态(状态可以是孩子或父母),如何查询具有第一列的表 - 个人 id 和第二列- 它的孩子 ID 的列表?
        • @brain-damage - 你现在失去了我。我给出的两个查询都应该完全符合您的要求...只需删除指定单个父项的 WHERE 子句(您可能希望使用 WHERE 子句 where status = 'paerent')。
        • 如果这不是您想要的,那么也许是您的表格数据示例,您想要实现的结果可能会对我们有所帮助
        猜你喜欢
        • 2018-05-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-09
        • 2016-04-02
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        相关资源
        最近更新 更多