Как выбрать строки для некоторых сотрудников, но нет строк для других - PullRequest
0 голосов
/ 28 мая 2019

У меня есть таблица EMP, в которой указано имя emplyee и выбранный план страхования Для сотрудников есть несколько строк, потому что они могут выбирать новый план каждый год. В любом поле не допускаются нулевые значения.

Как выбрать все строки для сотрудников с Планом 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 ]

2 голосов
/ 28 мая 2019

Вы можете использовать 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'
                 );
0 голосов
/ 28 мая 2019
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
              )
...