[英]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.