如何在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
更新:虽然它适用于非重复列表,但可能会导致具有重复值的表设置错误(即1
、20
、20
、1
在列中 - 如果允许重复,它仍然适合请求,但您没有提到这一点)。对于重复的情况也是一种方法:
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) 然后,看来,我误解了(上面的查询搜索完全匹配,即当1
和20
都存在时)【参考方案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中排除具有某些值的记录的主要内容,如果未能解决你的问题,请参考以下文章