繁体   English   中英

Not exists 子句未按预期工作

[英]Not exists clause isn't working as expected

我想搜索没有任何分析师 ( cod_role_acces ) 为其工作的每一家公司 ( niu_lds )。

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

这是我的查询:

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'
                );

我的问题是它让我拥有“分析师”的“公司”。 我想查看所有没有归属于该公司的“分析员”(cod_role_access) 的公司 (niu_lds)。

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

我的第一个问题: SQL 查询以检查值是否不存在

谢谢

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

如果没有,并且您想直观地查看比较发生了什么,您可以将不存在的 function 转换为左连接,以便您可以看到放置值的位置。

使用上一篇文章中的测试示例 -

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
        using(company)

以下是回报——

公司 姓名 轮廓 分析师
宝马 斯科特 分析师 1
宝马 国王 经理 1
宝马 麦克风 文员 1
树液 约翰 文员 null
树液 弗雷德 经理 null

您可以看到所有 BMW 都被标记为 Analyst,从这里开始,如果您想构建左连接而不是不存在但“隐藏”标记为 Analyst 的列,添加“where b.analyst is null”并删除 b .来自 select 声明的分析师 -

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
        using(company)
where b.analyst is null

这将返回预期的表 -

公司 姓名 轮廓
树液 约翰 文员
树液 弗雷德 经理

你可以试试下面的代码;

WITH all_roles AS (
SELECT *,
      SUM(CASE WHEN cod_role_acces = 'ANALYST' THEN 1 ELSE 0 END) OVER (PARTITION BY niu_lds ORDER BY niu_lds ) AS rolecount
FROM sr.c_r_v_obt_cp_util
)
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 all_roles 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 a.rolecount < 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM