Как выделить строки для одних сотрудников, но не выбрать строки для других

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

Как выбрать все строки для сотрудников с планом A или B, но не выбрать строки для любого сотрудника с планом C?

Таблица ЭМИ

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.


person swarmy_hulk    schedule 28.05.2019    source источник
comment
Какую СУБД вы используете? SQL Server, MySql и т. д.?   -  person Tyler Roper    schedule 28.05.2019
comment
Если у сотрудника есть план A, B, D. Строка с D также появляется только на A,B ??   -  person Juan Carlos Oropeza    schedule 28.05.2019
comment
Извините, забыл сказать, что использую Oracle 18c.   -  person swarmy_hulk    schedule 28.05.2019


Ответы (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'
                 );
person Gordon Linoff    schedule 28.05.2019

person    schedule
comment
Спасибо, у меня всегда проблемы с Group By. Это помогло мне лучше понять это, и это работает! - person swarmy_hulk; 29.05.2019