我有以下父子表:
父表
PARENT_ID | COL_A
1 | "DOG"
2 | "CAT"
3 | "FROG"子表
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。
所需的输出如下:
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字符串。
我可以加入如下表
SELECT
p.*,c.*
FROM
PARENT_TABLE p
LEFT JOIN
CHILD_TABLE c
ON p.PARENT_ID = c.PARENT_ID但这会产生不合并的行。如何将所有子行合并为一个行?
发布于 2021-05-12 08:29:25
看起来您想要使用listagg
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发布于 2021-05-12 08:28:23
Join with listagg;sample data直到第10行;查询从第11行开始。
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>发布于 2021-05-12 10:18:43
如果要生成xml元素,则应使用xml函数。在下面的查询中,我使用xmlserialize生成与您显示的完全相同的字符串,但在实际的应用程序中,您可能只需要生成xmlelements (不对结果调用xmlserialize )。
假设这些表名为parent和child,包含您所显示的列,查询和输出如下所示:
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。您可以更改为您的左外部连接(在我的查询中,它将是右外部连接)。
https://stackoverflow.com/questions/67495871
复制相似问题