我有一个要求,我希望子表行显示为逗号分隔的字符串而不是多行。
父表:员工
身份证 | 姓名 |
---|---|
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 | 罗汉 | 空 |
这可以通过使用
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
如果不需要相关子查询,可以使用
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 | 罗汉 | 空 |