想删除表中重复数据,只留下一条,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):保留每组重复数据中物理位置最小的行

相关推荐
程序员JerrySUN2 小时前
基于 RAUC 的 Jetson OTA 升级全攻略
java·数据库·redis
布朗克1683 小时前
MySQL UNION 操作符详细说明
数据库·mysql·union
喵桑..6 小时前
视图是什么?有什么用?什么时候用?MySQL中的视图
数据库·mysql
奋进小子8 小时前
达梦DISQL执行SQL和SQL脚本
数据库·sql
EasyCVR8 小时前
视频汇聚系统EasyCVR调用设备录像保活时视频流不连贯问题解决方案
数据库·ubuntu·音视频·云存储·云端录像
YueiL9 小时前
Linux文件系统基石:透彻理解inode及其核心作用
linux·网络·数据库
老华带你飞11 小时前
数码论坛|基于SprinBoot+vue的数码论坛系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·数码论坛系统
独泪了无痕11 小时前
Hutool-RedisDS:简化Redis操作的Java工具类
数据库·redis
北极糊的狐12 小时前
接口返回504 Gateway Time-out 错误,这意味着请求在网关或代理服务器等待上游服务器响应时超时。以下是可能的原因和排查建议:
数据库·gateway
sssnnndddfff12 小时前
Redis原理,命令,协议以及异步方式
数据库·redis·缓存