我有以下查询,它将子表记录组合为逗号分隔的字符串。但是当我尝试将过滤器应用于相关子查询时,值将替换为 null 而不是删除记录。
父表:员工
身份证 | 姓名 |
---|---|
I1BF91860BCB711EDBF4EF0FBCBCA9E17 | 蒂姆 |
I1BF91860BCB711EDBF4EF0FBCBCA9E18 | 山姆 |
I1BF91860BCB711EDBF4EF0FBCBCA9E19 | 罗汉 |
子表:培训
身份证 | 姓名 | 员工编号 |
---|---|---|
I1BF91860BCB711EDBF4EF0FBCBCA9P10 | Java 基础知识 | I1BF91860BCB711EDBF4EF0FBCBCA9E17 |
I1BF91860BCB711EDBF4EF0FBCBCA9P11 | 角度 | I1BF91860BCB711EDBF4EF0FBCBCA9E17 |
I1BF91860BCB711EDBF4EF0FBCBCA9P12 | 点网 | I1BF91860BCB711EDBF4EF0FBCBCA9E18 |
下面是查询,其输出如下所示
select e."Id" as Id
, e."Name" as Name
, (SELECT listagg(tr."Name", ',') within group(order by tr."Id")
FROM trainings tr WHERE e."Id" = tr."Employee Id")
trainingss
from employee e
输出:
如图所示,子值按预期分组为逗号分隔的字符串,但我在过滤子值时遇到问题。
如何使用子查询对子列值应用过滤器。假设我想用 JavaBasics 和 Angular 显示行,预期应该是第一行。但在下面的输出图像中,我可以看到所有行都显示为空值。
我尝试了什么?
select e."Id" as Id
, e."Name" as Name
, (SELECT listagg(tr."Name", ',') within group(order by tr."Id")
FROM trainings tr WHERE e."Id" = tr."Employee Id" and tr."Id" = 'I1BF91860BCB711EDBF4EF0FBCBCA9P10')
trainingss
from employee e
输出:
请注意,上面的示例只是我们需求的一个示例,在我们的实际案例场景中,我们有超过 150 列,而且都是动态的。因此我们不想使用 GroupBy
您可以对每个条件使用存在,或者计算接受过培训次数的员工(如果他们与您搜索的培训次数完全相同)
select e."Id" as Id
, e."Name" as Name
, (SELECT listagg(tr."Name", ',') within group(order by tr."Id")
FROM trainings tr WHERE e."Id" = tr."Employee Id"
)
trainings
from employee e
WHERE EXISTS (SELECT 1 FROM trainings tr1 WHERE e."Id" = tr1."Employee Id"
AND tr1."Id" IN ('I1BF91860BCB711EDBF4EF0FBCBCA9P10'))
身份证 | 姓名 | 培训 |
---|---|---|
I1BF91860BCB711EDBF4EF0FBCBCA9E17 | 蒂姆 | Java 基础知识,Angular |
select e."Id" as Id
, e."Name" as Name
, (SELECT listagg(tr."Name", ',') within group(order by tr."Id")
FROM trainings tr WHERE e."Id" = tr."Employee Id"
)
trainings
from employee e
WHERE EXISTS (SELECT 1 FROM trainings tr1 WHERE e."Id" = tr1."Employee Id"
AND tr1."Id" IN ('I1BF91860BCB711EDBF4EF0FBCBCA9P11'))
AND EXISTS (SELECT 1 FROM trainings tr1 WHERE e."Id" = tr1."Employee Id"
AND tr1."Id" IN ('I1BF91860BCB711EDBF4EF0FBCBCA9P10'))
身份证 | 姓名 | 培训 |
---|---|---|
I1BF91860BCB711EDBF4EF0FBCBCA9E17 | 蒂姆 | Java 基础知识,Angular |
select e."Id" as Id
, e."Name" as Name
, (SELECT listagg(tr."Name", ',') within group(order by tr."Id")
FROM trainings tr WHERE e."Id" = tr."Employee Id"
)
trainings
from employee e
WHERE e."Id" IN
(SELECT "Employee Id" FROM trainings
WHERE "Id" IN ('I1BF91860BCB711EDBF4EF0FBCBCA9P10','I1BF91860BCB711EDBF4EF0FBCBCA9P11')
GROUP BY "Employee Id"
HAVING COUNT(*) = 2)
身份证 | 姓名 | 培训 |
---|---|---|
I1BF91860BCB711EDBF4EF0FBCBCA9E17 | 蒂姆 | Java 基础知识,Angular |