如何为某些员工选择行,而为其他员工选择行

时间:2019-05-28 19:23:56

标签: sql oracle select oracle18c

我有一个表EMP,其中包含雇员姓名和保险计划选择。员工有多行,因为他们每年可以选择一个新计划。在任何字段中都不允许有空值。

如何为具有A或B计划的雇员选择所有行,而为具有C计划的雇员选择所有行?

EMP表

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  

换句话说,我想选择具有计划A或B的任何人,但是忽略拥有计划C的任何人的所有行。

2 个答案:

答案 0 :(得分:2)

您可以使用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'
                 );

答案 1 :(得分:0)

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
              )