【问题标题】:How to exclude records with certain values in sql如何在sql中排除具有某些值的记录
【发布时间】:2013-11-22 11:38:58
【问题描述】:

如何在 sql (MySQL) 中排除具有特定值的记录

Col1    Col2
-----   -----
A       1
A       20
B       1
C       20
C       1
C       88
D       1
D       20
D       3
D       1000
E       19
E       1

返回 Col1(和 Col2),但前提是 Col2 中的值为 1 或 20,但如果还有其他值(1 或 20 除外)则不返回

想要的结果:

Col1    Col2
-----   -----
A       1
A       20
B       1

但不是 C、D 和 E,因为 Col2 中的值不是 1 或 20

我为 Col2 使用了虚构的值,只有两个值(1 和 20),但实际上还有更多。
我可以将 IN ('1', '20') 用于值 1 和 20,但是如果 Col2 中还有另一个值,如何排除。 (没有范围!)

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    Select col1,col2
    From table
    Where col1 not in (Select col1 from table where col2 not in (1,20))
    

    【讨论】:

    • 非常好的答案.. 简单而强大:)
    【解决方案2】:

    使用SUM()

    SELECT
      *
    FROM
      t
      INNER JOIN
      (SELECT
         SUM(IF(Col2 IN (1, 20), 1, -1)) AS ranges,
         col1
      FROM
        t
      GROUP BY
         col1
      HAVING
        ranges=2) as counts 
     ON counts.col1=t.col1
    

    更新:虽然它适用于非重复列表,但可能会导致具有重复值的表设置错误(即120201在列中 - 如果允许重复,它仍然适合请求,但您没有提到这一点)。对于重复的情况也是一种方法:

    SELECT 
      t.* 
    FROM 
      t 
      INNER JOIN 
        (SELECT 
           col1, 
           col2 
         FROM 
           t 
         GROUP BY 
           col1 
         HAVING 
           COUNT(DISTINCT col2)=2 
           AND 
           col2 IN (1, 20)) AS counts 
        ON test.col1=counts.col1
    

    (当然,这也适用于普通情况)

    【讨论】:

    • 重复。但它没有找到 B 1(只有 A 1 和 A 20)
    • 然后,看来,我误解了(上面的查询搜索完全匹配,即当120 都存在时)
    【解决方案3】:

    NOT EXISTS 子句也可以这样做,

    Select A.COL1,A.COL2
    From MYTABLE A
    where NOT EXISTS
    (Select COL1 from MYTABLE B where  A.COL1=B.COL1 and
     COL2 NOT IN (1,20)
    GROUP BY COL1)
    

    liveDemo

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2014-05-15
      • 1970-01-01
      相关资源
      最近更新 更多