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

相关推荐
矢志不移7924 分钟前
SQLite 数据库
数据库·sqlite
RestCloud24 分钟前
10迁移TiDB数据库数据到GaussDB
数据库·tidb·etl·gaussdb·数据处理·数据同步·集成平台
小码农叔叔1 小时前
【AI智能体】Dify 实现自然语言转SQL操作数据库实战详解
人工智能·sql·mysql
vvilkim1 小时前
构建坚不可摧的数据堡垒:深入解析 Oracle 高可用与容灾技术体系
数据库·oracle
_風箏2 小时前
SpringBoot【集成generator】代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程
数据库·后端
_風箏2 小时前
SpringBoot【集成ClickHouse】clickhouse+mybatis-plus配置及使用问题说明(含建表语句、demo源码、测试说明)
数据库·后端
xcLeigh2 小时前
KingbaseES数据库:V8R3 迁移至 V9 全流程学习教程
数据库
正在走向自律2 小时前
在Ubuntu服务器上安装KingbaseES V009R002C012(Orable兼容版)数据库过程详细记录
数据库·oracle·国产数据库·kingbasees·ubuntu安装·电科金仓
没有羊的王K3 小时前
sql简单练习——随笔记
数据库·sql
运维技术小记3 小时前
4 台主机怎么搭 Greenplum 集群?3 种方案优缺点全解析,生产环境必看!
数据库