不存在子句未按预期工作

Not exists clause isn't working as expected

我想搜索没有任何分析师 (cod_role_acces) 工作的所有公司 (niu_lds)。

示例: 假设某公司 X 有 3 名员工。其中一位是分析师。我不希望那家公司出现在我的结果中。但如果 Y 公司有 2 名员工,其中 none 是“分析师”,那么我希望这家公司出现在结果中。

这是我的查询:

SELECT DISTINCT
    a.name_pers as "First Name",
    a.last_pers as "Last Name",
    a.id as "# account",
    a.cod_role_acces as "Profile", 
    a.niu_lds as "Company", 
    b.cod_missn as "Mission", 
    
FROM sr.c_r_v_obt_cp_util a inner join ods.c_od_missn_ld b on a.niu_lds = b.niu_lds

WHERE a.cod_eta_util in ('VER', 'APPR')
and a.id_cod_sr_alim = '2'
and b.cod_missn = 'PHA'

 and not exists (select null
                 from sr.c_r_v_obt_cp_util c 
                 where c.niu_lds = a.niu_lds
                 and a.cod_role_acces = 'ANALYST'
                );

我的问题是它返回给我的是有“分析师”的“公司”!我想查看所有没有 'ANALYST'(cod_role_access) 的公司 (niu_lds)。

我已经问过这个问题,有人帮了我很多,但我仍然没有得到预期的输出。

我的第一个问题:

谢谢

我相信罗密欧将 null 更改为 1 的答案可能会让您到达那里。

如果它不存在,并且您想直观地查看发生了什么以进行比较,您可以将不存在的函数转换为左连接,这样您就可以看到值的放置位置。

使用前面的测试示例post -

with test (company, ename, profile) as
      (select 'BMW', 'Scott', 'Analyst' union all
       select 'BMW', 'King' , 'Manager' union all
      select 'BMW', 'Mike' , 'Clerk'  union all
      select 'SAP', 'John' , 'Clerk' union all
      select 'SAP', 'Fred' , 'Manager' 
    )
  select a.company, a.ename, a.profile, b.analyst
  from test a
  left join (select 1 as analyst, company
        from test
        where profile = 'Analyst') b
        on b.company = a.company

下面是return-

COMPANY ENAME PROFILE ANALYST
BMW Scott Analyst 1
BMW King Manager 1
BMW Mike Clerk 1
SAP John Clerk null
SAP Fred Manager null

你可以看到所有的 BMW 都被标记为 Analyst,从这里,如果你想建立左连接而不是不存在但 'hide' 标记 Analyst 的列,添加 'where b.analyst is null' 并从 select 语句中删除 b.analyst -

with test (company, ename, profile) as
      (select 'BMW', 'Scott', 'Analyst' union all
       select 'BMW', 'King' , 'Manager' union all
      select 'BMW', 'Mike' , 'Clerk'  union all
      select 'SAP', 'John' , 'Clerk' union all
      select 'SAP', 'Fred' , 'Manager' 
    )
  select a.company, a.ename, a.profile
  from test a
  left join (select 1 as analyst, company
        from test
        where profile = 'Analyst') b
        on b.company = a.company
where b.analyst is null

这 return 是预期的 table -

COMPANY ENAME PROFILE
SAP John Clerk
SAP Fred Manager

编辑以添加 OP 的等效项:

这些应该与最初 posted 的逻辑和您的代码匹配 -

存在 AnalystFlag -

SELECT DISTINCT
    a.name_pers as "First Name",
    a.last_pers as "Last Name",
    a.id as "# account",
    a.cod_role_acces as "Profile", 
    a.niu_lds as "Company", 
    b.cod_missn as "Mission", 
    c.analyst as "AnalystFlag"
    
FROM sr.c_r_v_obt_cp_util a 
  inner join ods.c_od_missn_ld b 
    on a.niu_lds = b.niu_lds
  left join (select distinct 1 as analyst, niu_lds
                 from sr.c_r_v_obt_cp_util
                 where cod_role_acces = 'ANALYST') c
                 on a.niu_lds = c.niu_lds

WHERE a.cod_eta_util in ('VER', 'APPR')
and a.id_cod_sr_alim = '2'
and b.cod_missn = 'PHA'
;

删除 AnalystFlag -

SELECT DISTINCT
    a.name_pers as "First Name",
    a.last_pers as "Last Name",
    a.id as "# account",
    a.cod_role_acces as "Profile", 
    a.niu_lds as "Company", 
    b.cod_missn as "Mission", 
    
FROM sr.c_r_v_obt_cp_util a 
  inner join ods.c_od_missn_ld b 
    on a.niu_lds = b.niu_lds
  left join (select distinct 1 as analyst, niu_lds
                 from sr.c_r_v_obt_cp_util
                 where cod_role_acces = 'ANALYST') c
                 on a.niu_lds = c.niu_lds

WHERE a.cod_eta_util in ('VER', 'APPR')
and a.id_cod_sr_alim = '2'
and b.cod_missn = 'PHA'
and c.analyst IS NULL
;