如何在sql中排除具有某些值的记录

Posted

技术标签:

【中文标题】如何在sql中排除具有某些值的记录【英文标题】:How to exclude records with certain values in 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 中还有另一个值,如何排除。 (没有范围!)

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何在sql中排除具有某些值的记录的主要内容,如果未能解决你的问题,请参考以下文章

关于如何检查子表是不是具有某些多个值的雄辩或 SQL 方式

如何在nodejs中获取文件夹大小,排除具有glob模式的某些路径?

从运行总计 (SQL) 雪花中排除某些记录

排除 Qubole 中具有特定值的记录

如何排除具有零值的元素-XSLT?

查找具有一个值但没有其他值的 sql 记录