我正在使用sqlite。我正在导入一个数据集,其中ID被外部分配到临时表中,然后将其插入到我的永久表中。永久表使用外部标识(RunId)并且没有其他标识列。
我将表从csv导入到新表Book1中,其中C15是ID列。然后我运行插入:
INSERT INTO PrimusRuns (RunId, TransientName, RunDateStart, RunType, TestDateStart,
Gross, CPS, Shares, MaxExposure, PercentWin, Duration)
SELECT a.C15, a.C1, JULIANDAY(a.C2), a.C3,JULIANDAY(a.C4),
a.C6, a.C8, a.C9, a.C10, a.C11, a.C14
FROM Book1 as a;
但是我得到了主键约束错误:
[19] [SQLITE_CONSTRAINT_PRIMARYKEY] A PRIMARY KEY constraint failed (UNIQUE constraint failed: PrimusRuns.RunID)
首先我认为其中一些行已经在表格中但是正在运行:
SELECT * FROM Book1 WHERE C15 IN(
SELECT RunID from PrimusRuns
);
什么都不返回。
然后我意识到在我运行时导入中有重复的行:
SELECT * FROM Book1 GROUP BY C15 HAVING COUNT(*) > 1
这个聚合查询返回95行,这意味着我必须删除至少95行。如何删除告诉它删除重复项?
注意:还有其他类似的问题,但我的问题不同,因为id也是重复的。其他问题将列的其余部分分组并删除max(id)。但在我的情况下,max id返回的行不仅仅是一行。
答案 0 :(得分:1)
对于仅在删除重复行到C15时的相关内容,您可以通过C15找到所有min(id)组..所以这是每个C15值的单行 并删除其他例如
delete from
book1
where id not in (
select min(id)
from Book1
group by C15)
但是如果你有完整的完全重复的行,你可以在这些步骤中使用..
1)您可以创建一个临时表,其中包含重复的不同结果,例如:
create table my_temp_distinct as
select col1, col2 ...
from Book1
group by col1, col2, ...
having count(*)> 1
2)然后删除所有带有重复行的行
delete from
book1
where id in (
select min(id)
from Book1
group by C15)
3)并使用select形成最后一次插入停放的行
insert into Book1 (col1, col2 ....)
select col1, col2, ...
from my_temp_distinct