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

如何基于till_id与total字段删除SQL表中的完全重复行?

删除表中完全重复行的解决方案

你的查询确实只能定位到存在重复的字段组合,要删除重复行(保留每组重复中的一行),可以根据你使用的数据库选择以下方法:

通用方案(适用于几乎所有数据库)

如果你的数据库版本较低,不支持窗口函数,可以通过临时表中转:

-- 1. 创建临时表存储唯一行
CREATE TABLE temp_till_total AS
SELECT DISTINCT till_id, total FROM till_total;

-- 2. 清空原表
TRUNCATE TABLE till_total;

-- 3. 将唯一行插回原表
INSERT INTO till_total (till_id, total)
SELECT till_id, total FROM temp_till_total;

-- 4. 删除临时表
DROP TABLE temp_till_total;

现代数据库方案(支持窗口函数:MySQL 8.0+、SQL Server、PostgreSQL等)

利用ROW_NUMBER()窗口函数给每个重复组的行编号,删除编号大于1的行:

MySQL 8.0+

DELETE t
FROM (
    SELECT till_id, total,
           ROW_NUMBER() OVER (PARTITION BY till_id, total ORDER BY (SELECT NULL)) AS rn
    FROM till_total
) t
WHERE rn > 1;

SQL Server

WITH DuplicateRows AS (
    SELECT till_id, total,
           ROW_NUMBER() OVER (PARTITION BY till_id, total ORDER BY (SELECT NULL)) AS rn
    FROM till_total
)
DELETE FROM DuplicateRows
WHERE rn > 1;

PostgreSQL

WITH DuplicateRows AS (
    SELECT till_id, total,
           ROW_NUMBER() OVER (PARTITION BY till_id, total ORDER BY (SELECT NULL)) AS rn
    FROM till_total
)
DELETE FROM till_total
USING DuplicateRows
WHERE till_total.till_id = DuplicateRows.till_id
  AND till_total.total = DuplicateRows.total
  AND DuplicateRows.rn > 1;

说明:PARTITION BY till_id, total表示按这两个字段分组,同一组的行视为重复;ROW_NUMBER()会给每组内的行分配1、2、3...的编号,删除rn>1的行就会只保留每组的第一行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:54:09