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

相关推荐
UpYoung!13 分钟前
【数据库工具】DBeaver——轻量化多功能数据库连接工具DBeaver Ultimate 24.0.0版详细下载安装指南
数据库·mysql·sqlserver·数据库开发·数据库管理·dbeaver·数据库工具
爬山算法21 分钟前
MongoDB(92)什么是变更流(Change Streams)?
数据库·mongodb
xiaoshuaishuai844 分钟前
C# Submodule 避坑指南
服务器·数据库·windows·c#
绩隐金1 小时前
PostgreSQL 架构原理第三期:事务与并发控制 —— MVCC、快照与锁机制
数据库
2501_914245931 小时前
C#怎么使用属性Property C#自动属性和完整属性的区别get set怎么用【基础】
jvm·数据库·python
绩隐金1 小时前
SQL 与查询优化(PostgreSQL 篇)· 第五期
数据库
安当加密1 小时前
SQL Server 数据库安全新范式:TDE 透明加密+ DBG数据库安全网关 双重装甲
数据库·oracle
java干货1 小时前
如果光缆被挖断导致 Redis 出现两个 Master,怎么防止数据丢失?
数据库·redis·缓存
2401_837163892 小时前
CSS如何实现网页打印样式优化_利用@media print重写布局
jvm·数据库·python
Irene19912 小时前
Oracle 21c XE 安装后默认不包含HR等示例表,CO 模式、SCOTT 模式安装过程记录
数据库·oracle