不存在子句未按预期工作
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
;
我想搜索没有任何分析师 (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
;