想删除表中重复数据,只留下一条,sql怎么写

PostgreSQL 方法:

java 复制代码
DELETE FROM tbl_case_model
WHERE id NOT IN (
    SELECT MIN(id)  -- 保留id最小的记录
    FROM tbl_case_model
    GROUP BY
        column1,   -- 替换为实际重复列名
        column2,   -- 继续添加重复列
        ...        -- [所有需要比较的列]
);

因为我这次遇到的情况比较特殊,是表中所有数据都一模一样,那么使用MIN(id)或MAX(id)的方法确实不可行,因为无法区分重复行。

因此,我们可以这样操作:

  1. 使用ctid来保留每组重复数据中的一行(例如每组保留最小的ctid)。
  2. 删除其他重复行。
sql 复制代码
-- 使用 ctid(系统隐藏列)作为唯一行标识
DELETE FROM tbl_case_model
WHERE ctid NOT IN (
    SELECT MIN(ctid)  -- 保留每组重复数据中的第一行
    FROM tbl_case_model
    GROUP BY (tbl_case_model.*)  -- 按整行分组
);

ctid:PostgreSQL 的内部隐藏列,表示行的物理位置(类似行地址),绝对唯一

GROUP BY (tbl_case_model.*):按整行所有列分组(这是处理全列重复的关键)

MIN(ctid):保留每组重复数据中物理位置最小的行

相关推荐
jiayou6415 小时前
KingbaseES 表级与列级加密完全指南
数据库·后端
GBASE1 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr2 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
唐青枫3 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
吃糖的小孩3 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3504 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3504 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3504 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB4 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc