如何在SQL中查询单列(user_id)存在重复值对应的所有完整行
实现方案
下面给你两种常用的实现方式,你可以根据自己使用的数据库版本选择:
方法1:IN子查询(兼容所有SQL版本,最易理解)
思路是先统计所有出现次数≥2的user_id,再匹配这些user_id对应的全部行:
SELECT * FROM 你的表名 -- 这里替换成你实际的表名称 WHERE user_id IN ( SELECT user_id FROM 你的表名 GROUP BY user_id HAVING COUNT(user_id) >= 2 );
逻辑非常直白:内层子查询先把重复的user_id筛出来,外层再拉取这些user_id对应的所有完整行,完全匹配你的需求。
方法2:窗口函数(支持MySQL8.0+、PostgreSQL、SQL Server等主流新版本数据库)
用COUNT() OVER()统计每个user_id的出现次数,再过滤次数≥2的行即可:
SELECT id, user_id, name, age, address FROM ( SELECT *, COUNT(*) OVER (PARTITION BY user_id) AS user_id_cnt FROM 你的表名 ) t WHERE user_id_cnt >= 2;
这种写法不需要重复扫描表,数据量较大的时候性能比子查询更好。
内容的提问来源于stack exchange,提问作者Hiraeths
相关产品推荐
相关产品推荐

