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

时间:2017-04-27 14:58:30

标签: sqlite delete-row

我的表看起来像这样,有两列:

  1. ID
  2. 名称
  3. 我有多条记录,其中一些记录具有相同的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的所有行...

2 个答案:

答案 0 :(得分:2)

我可以通过创建另一个表并将该表复制到您想要的行中来查看它。这是一个经过测试的解决方案。

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')]

答案 1 :(得分:1)

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

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

select * from mytable;

输出:

1|Test1
2|Test1
3|Test1
  • 动态制作一张表,每个id只出现一次的rowid (()内的部分)
  • 删除没有其中一个rowid的所有内容
  • 选择剩下的所有内容,仅供演示

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

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