sql - 如何在没有附加表的情况下对行进行重复数据删除?
问题描述
我有一个包含一些重复的表,例如
-- 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,这对于大表来说变得不切实际。
解决方案
但这需要创建一个表 x 对于大表来说变得不切实际
相反,创建包含所有不同行的新表是具有大量重复项的大型表的首选方法。
x
使用与以下完全相同的架构创建新表t
:
CREATE TABLE x(a ... REFERENCES ...., b ..., value ...);
禁用外键约束检查以加快进程:
PRAGMA foreign_keys = OFF;
插入不同的行t
to x
:
INSERT INTO x(a, b, value)
SELECT a, b, MIN(value)
FROM t
GROUP BY a, b
放下桌子t
:
DROP TABLE t;
将表重命名x
为t
:
ALTER TABLE x RENAME TO t;
最后重新启用外键约束检查:
PRAGMA foreign_keys = ON;
查看简化的演示。
推荐阅读
- c++ - 如何检查n个给定图块中的任何一个是否重叠
- code-documentation - YARD doc - how to document a class type focusing on its parent class
- ruby - 代码没有检查 ruby 中的第二个 elsif 条件
- c# - 如何在 ASP.NET MVC 中使用会话 ID 获取会话详细信息
- javascript - 如何在通过“最佳位置”编辑进行内联编辑时删除 html 标签
- c++ - logb() 和 ilogb() 有什么区别?
- javascript - 如何检查文件下载是否在 Chrome 中完成?
- javascript - 如何调用嵌套在表格单元格中的textarea属性?
- mysql - Map.prototype.forEach 不迭代 Map
- parsing - 如何使用 Graph-API、3rd-party API 或解析读出喜欢或评论我的帖子的 instagram 帐户名称 (2019)?