You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:42:10