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

相关推荐
色空大师8 分钟前
【网站搭建实操(一)环境部署】
java·linux·数据库·mysql·网站搭建
亚历克斯神31 分钟前
Flutter for OpenHarmony: Flutter 三方库 mutex 为鸿蒙异步任务提供可靠的临界资源互斥锁(并发安全基石)
android·数据库·安全·flutter·华为·harmonyos
IAUTOMOBILE42 分钟前
用Python批量处理Excel和CSV文件
jvm·数据库·python
常利兵1 小时前
Spring项目新姿势:Lambda封装Service调用,告别繁琐注入!
java·数据库·spring
liqianpin12 小时前
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
数据库·mysql
kgduu2 小时前
js之客户端存储
javascript·数据库·oracle
light blue bird2 小时前
原生控件GDI完成作业协同界面
jvm·数据库·.net·winform·gdi+界面
聊点儿技术2 小时前
利用IP归属地查询识别异地登录风险:企业账号安全的技术探索
数据库·tcp/ip·安全
Ricky_Theseus3 小时前
SQL Server 的五种约束类型
数据库·sql·oracle
zjshuster3 小时前
数据库分库分表的方法论与实操
数据库·adb