删除多行,每个id只保留一行

Delete multiple rows and keep only one for each id

我有 table 看起来像这样有两列:

  1. id
  2. 名字

我有多条记录,其中一些记录有相同的id,我想删除所有重复的记录,每一行只保留一个id。

所以我有这样的数据:

id: 1
name: Test1

id: 1
name: Test1

id: 2
name: Test1

id: 2
name: Test1

id: 2
name: Test1

id: 3
name: Test1

并希望它变成这样:

id: 1
name: Test1

id: 2
name: Test1

id: 3
name: Test1

有什么实现方法吗?我试过 this 答案,但它返回了所有 id 为 1 的行...

我可以通过制作另一个 table 并将您想要的行复制到 table 来看到它的工作。这是经过测试的解决方案。

CREATE TABLE mytable (id,name);

INSERT INTO mytable
    (`id`, `name`)
VALUES
    ('1','Test1'),
    ('1','Test1'),
    ('2','Test1'),
    ('2','Test1'),
    ('2','Test1'),
    ('3','Test1')

CREATE TABLE mytable2 (id,name);

INSERT INTO mytable2 
    select m2.id, m2.name 
    from mytable m2
    group by m2.id || m2.name
    having count(m2.id || m2.name) >= 1

所需的结果集:

>>> conn.execute('select * from mytable2;').fetchall()
[(u'1', u'Test1'), (u'2', u'Test1'), (u'3', u'Test1')]

假设您要从数据库中删除重复项,而不仅仅是从输出中删除。

delete from mytable where ROWID not in (select ROWID from mytable group by id);

select * from mytable;

输出:

1|Test1
2|Test1
3|Test1
  • 动态创建一个 table,每个 id 只出现一次的 rowids
    ()内的部分)
  • 删除所有没有这些 rowids 之一的东西
  • select剩下的全部,仅供演示

使用 SQLite 3.18.0 2017-03-28 18:48:43

感谢@bernie 制作 mcve!
在 mcve 上工作比在值列表上工作更有效、更有趣。