首页 > 解决方案 > 如何在没有附加表的情况下对行进行重复数据删除?

问题描述

我有一个包含一些重复的表,例如

-- table definition: t(a,b,value)
select a, b
from t
group by a, b
having count(*) > 1;

我可以

create table x as 
 select a, b, min(value)
 from t
 group by a, b;
delete from t;
insert into t select * from x;
drop table x;

但这需要创建一个表 x,这对于大表来说变得不切实际。

标签: sqlsqlite

解决方案


但这需要创建一个表 x 对于大表来说变得不切实际

相反,创建包含所有不同行的新表是具有大量重复项的大型表的首选方法。

x使用与以下完全相同的架构创建新表t

CREATE TABLE x(a ... REFERENCES ...., b ..., value ...);

禁用外键约束检查以加快进程:

PRAGMA foreign_keys = OFF;

插入不同的行tto x

INSERT INTO x(a, b, value)
SELECT a, b, MIN(value)
FROM t
GROUP BY a, b

放下桌子t

DROP TABLE t;

将表重命名xt

ALTER TABLE x RENAME TO t;

最后重新启用外键约束检查:

PRAGMA foreign_keys = ON;

查看简化的演示


推荐阅读