SQL查询:如何筛选符合指定列值规则的所有目标行
SQL正确筛选语句方案
你原有写法的问题是仅做了行级规则校验,没有实现同ID全量校验的要求:只要同一个ID下存在任意一行Col1 = Col2,该ID下的所有行都需要被剔除,不能仅单独判断某一行是否符合规则。
方案1:NOT EXISTS 实现(全数据库兼容)
该写法兼容MySQL、PostgreSQL、SQL Server等所有主流SQL dialect:
SELECT t1.* FROM 你的表名 t1 WHERE NOT EXISTS ( SELECT 1 FROM 你的表名 t2 WHERE t2.ID = t1.ID AND t2.Col1 = t2.Col2 )
逻辑说明:子查询会校验当前ID是否存在Col1=Col2的记录,只要存在就直接剔除该ID下的所有行,Null值比较时Col1=Null不会判定为成立,符合需求。
方案2:窗口函数实现(支持MySQL8.0+等新数据库)
如果你的数据库支持窗口函数,可以用CTE+统计窗口的写法:
WITH id_match_stat AS ( SELECT *, SUM(CASE WHEN Col1 = Col2 THEN 1 ELSE 0 END) OVER (PARTITION BY ID) AS equal_count FROM 你的表名 ) SELECT ID, Col1, Col2 FROM id_match_stat WHERE equal_count = 0
逻辑说明:先按ID分组统计每个ID下Col1=Col2的记录行数,仅保留行数为0的ID对应的所有行。
执行结果验证
两种写法执行后得到的结果都符合你的预期:
| ID | Col1 | Col2 |
|---|---|---|
| 646 | 1 | Null |
| 1223 | 8 | 1 |
| 1223 | 8 | 2 |
| 1223 | 8 | 3 |
内容的提问来源于stack exchange,提问作者BCBugajski
相关产品推荐
相关产品推荐

