如何为某些员工 select 行,但对其他员工没有行
How to select rows for some employees, but no rows for others
我有一个 table EMP,其中包含员工姓名和保险计划 selections。员工有多个行,因为他们每年可以选择一个新计划。任何字段都不允许空值。
我如何 select 具有 A 或 B 计划的员工的所有行,但没有任何具有 C 计划的员工的行?
电磁脉冲Table
Name | Date | Plan |
John | 1/2018 | A |
John | 1/2017 | B |
Alice | 1/2018 | C |
Bob | 1/2018 | A |
Bob | 1/2017 | C |
Bob | 1/2016 | B |
Dave | 1/2018 | B |
Dave | 1/2017 | B |
结果应该是:
John 1/2018 A
John 1/2017 B
Dave 1/2018 B
Dave 1/2017 B
换句话说,我想 select 任何有计划 A 或 B 的人,但忽略任何曾有计划 C 的人的所有行。
SELECT *
FROM EMP
WHERE Name IN ( SELECT Name
FROM EMP
GROUP BY Name
HAVING COUNT( CASE WHEN Plan IN ('A','B') THEN 1 END) > 0
AND COUNT( CASE WHEN Plan = 'C' THEN 1 END) = 0
)
您可以使用 not exists
:
select e.*
from emp e
where plan in ('A', 'B') and
not exists (select 1
from emp e2
where e2.name = e.name and e2.plan = 'C'
);
我有一个 table EMP,其中包含员工姓名和保险计划 selections。员工有多个行,因为他们每年可以选择一个新计划。任何字段都不允许空值。
我如何 select 具有 A 或 B 计划的员工的所有行,但没有任何具有 C 计划的员工的行?
电磁脉冲Table
Name | Date | Plan |
John | 1/2018 | A |
John | 1/2017 | B |
Alice | 1/2018 | C |
Bob | 1/2018 | A |
Bob | 1/2017 | C |
Bob | 1/2016 | B |
Dave | 1/2018 | B |
Dave | 1/2017 | B |
结果应该是:
John 1/2018 A
John 1/2017 B
Dave 1/2018 B
Dave 1/2017 B
换句话说,我想 select 任何有计划 A 或 B 的人,但忽略任何曾有计划 C 的人的所有行。
SELECT *
FROM EMP
WHERE Name IN ( SELECT Name
FROM EMP
GROUP BY Name
HAVING COUNT( CASE WHEN Plan IN ('A','B') THEN 1 END) > 0
AND COUNT( CASE WHEN Plan = 'C' THEN 1 END) = 0
)
您可以使用 not exists
:
select e.*
from emp e
where plan in ('A', 'B') and
not exists (select 1
from emp e2
where e2.name = e.name and e2.plan = 'C'
);