如何从SQL表中过滤掉某指定列存在重复值的所有行
SQL过滤指定列无重复值的行方案
区别于DISTINCT保留重复值的其中一条,该需求要实现的是只要指定列的某个取值存在重复,就剔除该取值对应的全部行,仅保留该列取值仅出现一次的对应行。
适用示例场景
原始表数据:
| ORDER_ID | NAME |
|---|---|
| ORD1 | Aaron |
| ORD2 | BOB |
| ORD3 | Carry |
| ORD1 | Danny |
| ORD2 | Emily |
| ORD2 | Frank |
预期输出结果:
| ORDER_ID | NAME |
|---|---|
| ORD3 | Carry |
实现方案
方案1:子查询分组统计(全数据库兼容)
通过分组统计指定列的出现次数,筛选出仅出现1次的取值后再匹配对应行:
SELECT * FROM 你的表名 WHERE ORDER_ID IN ( SELECT ORDER_ID FROM 你的表名 GROUP BY ORDER_ID HAVING COUNT(*) = 1 );
方案2:窗口函数(支持MySQL8.0+/PostgreSQL/SQL Server等)
用窗口函数给每行标记对应指定列的总出现次数,直接过滤即可:
SELECT ORDER_ID, NAME FROM ( SELECT *, COUNT(*) OVER (PARTITION BY ORDER_ID) AS order_occur_cnt FROM 你的表名 ) temp_table WHERE order_occur_cnt = 1;
内容的提问来源于stack exchange,提问作者Tushar Seth
相关产品推荐
相关产品推荐

