SQLite删除重复数据后,如何将新数据保存为新表?
在SQLite中删除重复项并保存为新表的解决方案
我需要从包含10000行数据的Table1中删除重复项,删除后将新表命名为newtable1。已经完成重复数据删除,但不清楚如何保存新表,想了解第三段代码(第三个分号后)需添加的语句。
原表Table1数据片段
| ID | DATE1 | TIME |
|---|---|---|
| 12 | 2021-07-08 | 2:00:34 |
| 11 | 2020-08-03 | 9:19:39 |
| 33 | 2020-07-04 | 10:18:00 |
| 33 | 2020-07-04 | 10:18:00 |
删除重复项后的目标表newtable1
| ID | DATE1 | TIME |
|---|---|---|
| 12 | 2021-07-08 | 2:00:34 |
| 11 | 2020-08-03 | 9:19:39 |
| 33 | 2020-07-04 | 10:18:00 |
现有代码的问题说明
- 第一段
CREATE TABLE table1 AS SELECT * FROM table1会报错,SQLite不允许直接创建与现有表同名的新表。 - 删除重复项的语句中,
from table是笔误,应为from table1。 - 你最后用
ALTER TABLE table1 RENAME TO newtable1的思路可行,但需要先修正删除语句的逻辑,确保只删除真正的重复项。
方案一:直接创建去重后的新表(推荐)
无需先修改原表,直接通过查询生成无重复的新表,更安全:
-- 直接生成去重后的newtable1,保留每组重复数据中rowid最小的行 CREATE TABLE newtable1 AS SELECT * FROM table1 WHERE DATE1 >= '2020-07-01' AND rowid IN ( SELECT MIN(rowid) FROM table1 WHERE DATE1 >= '2020-07-01' GROUP BY ID, DATE1, TIME -- 按所有需判断重复的字段分组 );
GROUP BY ID, DATE1, TIME:确保只有三个字段完全相同的数据才被判定为重复项。MIN(rowid):保留每组重复数据中最早插入的行,若需保留最晚插入的行,可改为MAX(rowid)。
方案二:删除原表重复项后重命名(修正你的原有思路)
如果你坚持先处理原表再重命名,需先修正删除逻辑:
-- 第一步:备份原表(新手强烈推荐,防止误操作) CREATE TABLE table1_backup AS SELECT * FROM table1; -- 第二步:删除table1中的重复项 DELETE FROM table1 WHERE DATE1 >= '2020-07-01' AND rowid NOT IN ( SELECT MIN(rowid) FROM table1 WHERE DATE1 >= '2020-07-01' GROUP BY ID, DATE1, TIME ); -- 第三步:将处理后的表重命名为newtable1 ALTER TABLE table1 RENAME TO newtable1;
验证去重结果
执行完成后,可通过以下语句确认重复项已删除:
SELECT ID, DATE1, TIME, COUNT(*) AS count FROM newtable1 GROUP BY ID, DATE1, TIME HAVING COUNT(*) > 1;
若查询结果为空,说明重复项已完全清理。
内容的提问来源于stack exchange,提问作者mq19745422
相关产品推荐
相关产品推荐

