删除多行,每个id只保留一行
Delete multiple rows and keep only one for each id
我有 table 看起来像这样有两列:
- id
- 名字
我有多条记录,其中一些记录有相同的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 上工作比在值列表上工作更有效、更有趣。
我有 table 看起来像这样有两列:
- id
- 名字
我有多条记录,其中一些记录有相同的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 上工作比在值列表上工作更有效、更有趣。