首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将所有子记录中的列合并为一列

将所有子记录中的列合并为一列
EN

Stack Overflow用户
提问于 2021-05-12 08:24:40
回答 3查看 30关注 0票数 0

我有以下父子表:

父表

代码语言:javascript
运行
复制
PARENT_ID | COL_A 

1         |  "DOG"
2         |  "CAT"
3         |  "FROG"

子表

代码语言:javascript
运行
复制
CHILD_ID  | PARENT_ID | COL_B   | COL_C
 
1         |  1        | "JOE"   | "DOE"
2         |  2        | "BOB"   | "BOBSON"
3         |  2        | "MARY"  | "DOETTE"
4         |  3        | "KEVIN" | "KEVINSON"
5         |  3        | "TOM"   | "TOMSON"
6         |  3        | "VIC"   | "VICSON"

现在,我想通过以一种自定义的方式连接列,将所有子行合并成一行,这样它就会生成漂亮的html。

所需的输出如下:

代码语言:javascript
运行
复制
PARENT_ID | COL_A    | CUSTOM_COL

1         |  "DOG"   | <H1>JOE DOE</H1>
2         |  "CAT"   | <H1>BOB BOBSON, MARY DOETTE</H1>
3         |  "FROG"  | <H1>KEVIN KEVINSON, TOM TOMSON, VIC VICSON</H1>

本质上,我试图做的是以一种我可以自定义输出的方式组合所有的子行。在本例中,我需要列是一个html字符串。

我可以加入如下表

代码语言:javascript
运行
复制
SELECT 
p.*,c.*
FROM
PARENT_TABLE p
LEFT JOIN
CHILD_TABLE c
ON p.PARENT_ID = c.PARENT_ID

但这会产生不合并的行。如何将所有子行合并为一个行?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-12 08:29:25

看起来您想要使用listagg

代码语言:javascript
运行
复制
SELECT p.parent_id,
       p.col_a,
       '<h1>' ||
         listagg(c.col_b || ' ' || c.col_c) 
           within group( order by c.child_id ) ||
         '</h1>' agg_column
  FROM PARENT_TABLE p
       LEFT JOIN CHILD_TABLE c
         ON p.PARENT_ID = c.PARENT_ID
 GROUP BY p.parent_id,
          p.col_a
票数 2
EN

Stack Overflow用户

发布于 2021-05-12 08:28:23

Join with listagg;sample data直到第10行;查询从第11行开始。

代码语言:javascript
运行
复制
SQL> with
  2  parent (parent_id, col_a) as
  3    (select 1, 'Dog' from dual union all
  4     select 2, 'Cat' from dual
  5    ),
  6  child (child_id, parent_Id, col_b, col_c) as
  7    (select 1, 1, 'Joe', 'Doe'     from dual union all
  8     select 2, 2, 'Bob', 'Bobson'  from dual union all
  9     select 3, 2, 'Mary', 'Doette' from dual
 10    )
 11  select p.parent_id, p.col_a,
 12    '<H1>' ||
 13    listagg(c.col_b ||' '|| c.col_c, ', ') within group (order by null)  ||
 14    '</H1>' custom_col
 15  from parent p join child c on c.parent_id = p.parent_id
 16  group by p.parent_Id, p.col_a;

 PARENT_ID COL CUSTOM_COL
---------- --- ----------------------------------------
         1 Dog <H1>Joe Doe</H1>
         2 Cat <H1>Bob Bobson, Mary Doette</H1>

SQL>
票数 1
EN

Stack Overflow用户

发布于 2021-05-12 10:18:43

如果要生成xml元素,则应使用xml函数。在下面的查询中,我使用xmlserialize生成与您显示的完全相同的字符串,但在实际的应用程序中,您可能只需要生成xmlelements (不对结果调用xmlserialize )。

假设这些表名为parentchild,包含您所显示的列,查询和输出如下所示:

代码语言:javascript
运行
复制
select parent_id, col_a,
       xmlserialize(document xmlelement("HI", hi_list)) as custom_col
from   (
         select parent_id, 
                listagg(col_b || ' ' || col_c, ', ') 
                        within group (order by child_id) as hi_list
         from   child
         group  by parent_id
       )
       full outer join parent using (parent_id)
;

PARENT_ID COL_A CUSTOM_COL
--------- ----- -----------------------------------------------
        1 DOG   <HI>JOE DOE</HI>                
        2 CAT   <HI>BOB BOBSON, MARY DOETTE</HI>
        3 FROG  <HI>KEVIN KEVINSON, TOM TOMSON, VIC VICSON</HI>

我使用了一个完整的外连接,以防两个表中都有不匹配的id。您可以更改为您的左外部连接(在我的查询中,它将是右外部连接)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67495871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档