技术问询:如何编写SQL语句查询表中某列值相同的单行所有字段?
没问题!我帮你整理几种实用的SQL写法,能帮你从指定表中提取出某列值重复的分组里的单行全字段数据,你可以根据自己用的数据库选合适的方案:
方法1:用GROUP BY + 聚合函数(兼容大多数数据库)
如果不需要特意指定取重复分组里的哪一行,这种方法最通用——它会返回每个重复列值分组里的任意一行数据:
-- 适用于对GROUP BY规则要求严格的数据库(比如PostgreSQL) SELECT col1, col2, col3, MAX(id) AS row_id FROM your_table GROUP BY col1, col2, col3 HAVING COUNT(your_target_column) > 1;
要是你用的是MySQL 8.0及以上版本,还可以用ANY_VALUE()函数简化写法,不用把所有非聚合列都放进GROUP BY:
SELECT ANY_VALUE(col1), ANY_VALUE(col2), your_target_column FROM your_table GROUP BY your_target_column HAVING COUNT(*) > 1;
注意:把your_table换成你的实际表名,your_target_column换成你要检查重复的列,col1/col2/col3换成你需要提取的字段
方法2:用窗口函数(适合支持窗口函数的数据库,如MySQL8.0+、PostgreSQL、SQL Server)
这种方法更灵活,能精准控制取重复分组里的某一行(比如最早插入的、最新的):
WITH duplicate_groups AS ( SELECT *, -- 按目标列分组,按id排序给每行编号,每组第一行编号为1 ROW_NUMBER() OVER (PARTITION BY your_target_column ORDER BY id) AS row_num FROM your_table ) SELECT * FROM duplicate_groups -- 只取每组的第一行,且该组确实有重复数据 WHERE row_num = 1 AND ( SELECT COUNT(*) FROM duplicate_groups dg WHERE dg.your_target_column = duplicate_groups.your_target_column ) > 1;
如果你用的是PostgreSQL,还可以用DISTINCT ON来实现更高效的查询:
SELECT DISTINCT ON (your_target_column) * FROM your_table WHERE your_target_column IN ( SELECT your_target_column FROM your_table GROUP BY your_target_column HAVING COUNT(*) > 1 ) -- 这里的ORDER BY决定取重复组里的哪一行,比如按id升序取最早的行 ORDER BY your_target_column, id;
要是你其实想找出所有重复的行(不是每组只取一行),那可以简化成这个写法:
SELECT * FROM your_table WHERE your_target_column IN ( SELECT your_target_column FROM your_table GROUP BY your_target_column HAVING COUNT(*) > 1 );
内容的提问来源于stack exchange,提问作者PHP Programmer
相关产品推荐
相关产品推荐

