Фильтрация данных по условию - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть таблица, как показано ниже. Мне нужно выяснить сотрудников, которые имеют ранг 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

Ответы [ 6 ]

0 голосов
/ 27 апреля 2018

Очевидно использовать 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') );
0 голосов
/ 27 апреля 2018

Я бы сделал:

SELECT ecode, name
FROM t
WHERE rank IN ('R1', 'C1', 'C2')
GROUP BY ecode, name
HAVING MIN(rank) = MAX(rank) AND MAX(rank) = 'R1';
0 голосов
/ 27 апреля 2018

Вы можете использовать комбинацию exists и not 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'))
0 голосов
/ 27 апреля 2018

Один подход использует агрегацию по сотруднику:

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
0 голосов
/ 27 апреля 2018

Попробуйте это:

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)
0 голосов
/ 27 апреля 2018
Select * from (tablename)
where Rank = 'R1'
and Rank not in (Select Rank from (tablename)
where Rank = 'C1' 
or Rank = 'C2')
...