【问题标题】:Filter data based on condition根据条件过滤数据
【发布时间】:2018-10-08 11:00:54
【问题描述】:

我有一张如下表。我需要找出具有 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

【问题讨论】:

  • 人们常常对“和”的使用不小心(他们通常表示“或”),所以我会问:如果员工的等级为 C1,你想排除他们 C2(或可能两者兼有),还是仅当员工同时具有等级 C1 和等级 C2(在不同的行中)时才排除他们?

标签: sql oracle not-exists


【解决方案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

【讨论】:

    【解决方案2】:

    试试这个:

    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)
    

    【讨论】:

      【解决方案3】:

      我愿意:

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

      【讨论】:

        【解决方案4】:

        显然使用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') );
        

        【讨论】:

        • 我用过这个。工作完美。感谢您的帮助。
        【解决方案5】:

        您可以使用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'))
        

        【讨论】:

        • 你还是我们每天看到的那个 Yogesh Sharma 吗?
        • @TimBiegeleisen.. 是的,因为我无法访问自己的帐户。因此,我创建了这个作为访客帐户。
        【解决方案6】:
        Select * from (tablename)
        where Rank = 'R1'
        and Rank not in (Select Rank from (tablename)
        where Rank = 'C1' 
        or Rank = 'C2')
        

        【讨论】:

        • 这行不通,实际上没有意义,因为如果排名是 R1,那么根据定义将不符合您的两个 LIKE 条件。
        • 另外你为什么把()放在表名周围——你是想保护它不受什么影响吗?先评估一下?
        猜你喜欢
        • 1970-01-01
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        • 2019-06-08
        • 1970-01-01
        相关资源
        最近更新 更多