我相信 Romeo 将 null 更改为 1 的答案可能会让你到达那里。
如果没有,并且您想直观地查看发生了什么比较,您可以将 not exists 函数转换为左连接,这样您就可以看到值的放置位置。
使用上一篇文章中的测试示例 -
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
以下是返回-
| 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,如果您想构建左连接而不是不存在但“隐藏”标记为 Analyst 的列,请添加“其中 b.analyst 为空”并从 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
这将返回预期的表 -
| COMPANY |
ENAME |
PROFILE |
| SAP |
John |
Clerk |
| SAP |
Fred |
Manager |
编辑添加了 OP 的等价物:
这些应该与最初发布的逻辑和您的代码相匹配 -
存在 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
;