在 Oracle 中将子表行转换为逗号分隔值

问题描述 投票:0回答:2

我有一个要求,我希望子表行显示为逗号分隔的字符串而不是多行。

父表:员工

身份证 姓名
I1BF91860BCB711EDBF4EF0FBCBCA9E17 蒂姆
I1BF91860BCB711EDBF4EF0FBCBCA9E18 山姆
I1BF91860BCB711EDBF4EF0FBCBCA9E19 罗汉

子表:培训

身份证 姓名 员工编号
I1BF91860BCB711EDBF4EF0FBCBCA9P10 Java 基础知识 I1BF91860BCB711EDBF4EF0FBCBCA9E17
I1BF91860BCB711EDBF4EF0FBCBCA9P11 角度 I1BF91860BCB711EDBF4EF0FBCBCA9E17
I1BF91860BCB711EDBF4EF0FBCBCA9P12 点网 I1BF91860BCB711EDBF4EF0FBCBCA9E18

预期输出:

身份证 姓名 培训
I1BF91860BCB711EDBF4EF0FBCBCA9E17 蒂姆 Java 基础知识,Angular
I1BF91860BCB711EDBF4EF0FBCBCA9E18 山姆 点网
I1BF91860BCB711EDBF4EF0FBCBCA9E19 罗汉

查询我用过的

select id as Id, name as Name, (select listagg(tr.name, ',') within group(order by id) from trainings where employee_id = employee.id) as Trainings from employee where employee.id = trainings.employeeId(+)

上面只是一个示例,但在实际情况中,我们有更多数量的列和连接的许多表。我知道我们可以使用 groupby 子句,但在我们的例子中,我们有更多的数字列(大约 200),并且所有列都是动态的,用户可以从 Ui(Ag Grid)中进行选择。

上面的查询生成带有逗号分隔字符串的数据,但我在连接上得到了重复的数据,如下所示。

我可以知道我哪里错了吗?有没有办法限制连接上的重复值并使用子查询将多个子行合并为单行?

身份证 姓名 培训
I1BF91860BCB711EDBF4EF0FBCBCA9E17 蒂姆 Java 基础知识,Angular
I1BF91860BCB711EDBF4EF0FBCBCA9E17 蒂姆 Java 基础知识,Angular
I1BF91860BCB711EDBF4EF0FBCBCA9E18 山姆 点网
I1BF91860BCB711EDBF4EF0FBCBCA9E19 罗汉
oracle spring-boot ag-grid oracle12c
2个回答
0
投票

这可以通过使用

left join
按雇员 ID 连接两个表,然后使用
group by
listagg
来完成,以获得预期的输出:

select e.Id, max(e.Name) as Name, listagg(t.NAME, ',') as training
from Employee e
left join Trainings t on t.Employee_Id = e.Id
group by e.Id
order by e.Id

演示在这里


0
投票

如果不需要相关子查询,可以使用

GROUP BY
LEFT JOIN

select e."Id" as Id
, e."Name" as Name
, listagg(tr."Name", ',') within group(order by tr."Id") trainings
from employee e LEFT JOIN trainings tr
ON e."Id" = tr."Employee Id"
GROUP BY e."Id",e."Name"
身份证 姓名 培训
I1BF91860BCB711EDBF4EF0FBCBCA9E17 蒂姆 Java 基础知识,Angular
I1BF91860BCB711EDBF4EF0FBCBCA9E18 山姆 点网
I1BF91860BCB711EDBF4EF0FBCBCA9E19 罗汉

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.