You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何删除SQL表中word与isOxford组合重复的条目?

解决SQL表重复条目删除问题

嘿,针对你要删除wordisOxford组合重复行的需求,我整理了几个实用的解决方案,刚好匹配你保留每组最小wordId记录的要求:

方法1:通用子查询写法(适配多数数据库)

这个思路很直接:先找出每个word+isOxford组合的最小wordId,然后删除不在这个集合里的所有重复行。几乎所有关系型数据库(MySQL、SQL Server、PostgreSQL等)都支持:

DELETE FROM your_table
WHERE wordId NOT IN (
    SELECT MIN(wordId)
    FROM your_table
    GROUP BY word, isOxford
);

记得把your_table替换成你实际的表名哦。执行后就会只保留每个唯一组合里wordId最小的那条记录,完全符合你的期望结果。

方法2:CTE写法(可读性更强,适用于新版本数据库)

如果你的数据库支持CTE(比如SQL Server、PostgreSQL、MySQL 8.0及以上),用这种写法逻辑更清晰:我们给每组重复行按wordId排序标记序号,然后删掉序号大于1的行:

WITH ranked_records AS (
    SELECT 
        wordId,
        word,
        isOxford,
        -- 按word和isOxford分组,每组内按wordId升序排,最小的id序号为1
        ROW_NUMBER() OVER (PARTITION BY word, isOxford ORDER BY wordId ASC) AS row_num
    FROM your_table
)
DELETE FROM ranked_records
WHERE row_num > 1;

方法3:MySQL专属JOIN写法(避开子查询限制)

有些旧版本MySQL对DELETE里的子查询有语法限制,这时候用JOIN的方式更稳妥:

DELETE t1
FROM your_table t1
JOIN your_table t2 
ON t1.word = t2.word AND t1.isOxford = t2.isOxford AND t1.wordId > t2.wordId;

这个逻辑是:找到所有和t2的wordisOxford相同,但wordId更大的t1行,直接删除这些重复的t1行,最终保留每组里wordId最小的记录。

验证结果

执行完删除操作后,你可以用下面的SQL确认结果是否符合预期:

SELECT * FROM your_table ORDER BY wordId;

返回的结果应该就是你想要的:

wordId word    isOxford
1214   pen     0
1216   bat     0
1217   bottle  1
1218   pen     1
1220   rose    0

内容的提问来源于stack exchange,提问作者iamal

火山引擎 最新活动