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

Sql 如何为某些员工选择行,而不为其他员工选择行,sql,oracle,select,oracle18c,Sql,Oracle,Select,Oracle18c,我有一个EMP表,其中包含员工姓名和保险计划选择。员工有多行,因为他们每年可以选择一个新计划。任何字段中都不允许有空值 如何为计划为a或B的员工选择所有行,但如何为计划为C的员工选择没有行 电磁脉冲表 Name | Date | Plan | John | 1/2018 | A | John | 1/2017 | B | Alice | 1/2018 | C | Bob | 1/2018 | A | Bob

我有一个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的人的所有行。

您可以使用
不存在

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
              )
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'
                 );

您可以使用
不存在

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'
                 );

您正在使用什么RDBMS?SQL Server、MySql等?如果员工有计划A、B、D。带
D
的行是否也只出现在
A、B
上?对不起,忘了说我使用的是Oracle 18C您使用的是什么RDBMS?SQL Server、MySql等?如果员工有计划A、B、D。是否只在
A、B
上显示带有
D
的行?对不起,忘了说我使用的是Oracle 18cThanks,我在使用“分组依据”时总是遇到问题。这有助于我更好地理解它,而且它很有效!谢谢,我总是在“分组方式”上遇到麻烦。这有助于我更好地理解它,而且它很有效!