如何在sqlite中删除包含ID的每个列都是重复的重复行? [重复]

问题描述 投票:5回答:1

这个问题在这里已有答案:

我正在使用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返回的行不仅仅是一行。

sql sqlite
1个回答
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)使用从停放的行中选择的最后一个插入

insert into Book1 (col1, col2 ....)
select col1, col2, ...
from my_temp_distinct
© www.soinside.com 2019 - 2024. All rights reserved.