相关子查询上的过滤器返回 null oracle

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

我有以下查询,它将子表记录组合为逗号分隔的字符串。但是当我尝试将过滤器应用于相关子查询时,值将替换为 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

spring-boot oracle12c ag-grid-angular
1个回答
0
投票

您可以对每个条件使用存在,或者计算接受过培训次数的员工(如果他们与您搜索的培训次数完全相同)

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

小提琴

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