根据条件过滤数据

Filter data based on condition

我有一个 table 如下所示。我需要找出等级为 R1 但从来没有等级为 C1 和 C2 的员工。

Id  ECode Name Rank
1   EMP1    AA  R1
2   EMP2    BB  R1
3   EMP1    AA  R2
4   EMP1    AA  C1
5   EMP1    AA  C2
6   EMP1    AA  C3
7   EMP2    BB  C4
8   EMP2    BB  C5
9   EMP3    CC  R1
10  EMP3    CC  C1
11  EMP3    CC  C2
12  EMP3    CC  C4
13  EMP4    DD  R1
14  EMP4    DD  C3
Select * from (tablename)
where Rank = 'R1'
and Rank not in (Select Rank from (tablename)
where Rank = 'C1' 
or Rank = 'C2')

试试这个:

SELECT *
  FROM EMPLOYES  A
 WHERE RANK = 'R1'
   AND NOT EXISTS(SELECT 1 
                    FROM EMPLOYES  B
                   WHERE B.ECODE = A.ECODE
                     AND RANK IN ('C1','C2')
                     AND ROWNUM = 1)

一种方法使用员工汇总:

SELECT ECode, Name
FROM yourTable
GROUP BY ECode, Name
HAVING
    SUM(CASE WHEN Rank = 'R1' THEN 1 ELSE 0 END) > 0 AND
    SUM(CASE WHEN Rank IN ('C1', 'C2') THEN 1 ELSE 0 END) = 0

您可以使用 existsnot exists 的组合:

select * 
from table t 
where exists (select 1 from table where ECode = t.ECode and Rank = 'R1') AND 
      not exists (select 1 from table where ECode = t.ECode and Rank IN ('C1', 'C2'))

我会做:

SELECT ecode, name
FROM t
WHERE rank IN ('R1', 'C1', 'C2')
GROUP BY ecode, name
HAVING MIN(rank) = MAX(rank) AND MAX(rank) = 'R1';

显然使用 NOT EXISTS :

select *
  from mytable t
 where t.rank = 'R1' 
   and not exists ( select ECode from mytable where ECode = t.ecode and  rank in ('C1','C2') );