Sql 删除重复的行2
我有一个大的~1000000行表,它可能包含重复的行,也可能包含空值 我想做的是: 仅选择distinc行。 删除具有重复“id”字段的行。 让我们坐一张桌子:Sql 删除重复的行2,sql,sqlite,duplicates,distinct,Sql,Sqlite,Duplicates,Distinct,我有一个大的~1000000行表,它可能包含重复的行,也可能包含空值 我想做的是: 仅选择distinc行。 删除具有重复“id”字段的行。 让我们坐一张桌子: id | a | b 1 | 2 | 3 2 | 8 | 7 3 | 9 | 10 2 | 8 | 7 3 | 20| 12 我想得到的是: id | a | b 1 | 2 | 3 2 | 8 | 7 id为2的行保留在一个副本中,而id为3的行被删除 我在想:
id | a | b
1 | 2 | 3
2 | 8 | 7
3 | 9 | 10
2 | 8 | 7
3 | 20| 12
我想得到的是:
id | a | b
1 | 2 | 3
2 | 8 | 7
id为2的行保留在一个副本中,而id为3的行被删除
我在想:
从表中选择不同的id、a、b;只获取不同的行。
以某种方式过滤1的结果以删除重复ID。
解决这个问题的最佳方法是什么?第三个答案现在问题稍微清楚了一些:
SELECT id, min(a) as a, min(b) as b
FROM (SELECT DISTINCT id, a, b FROM table) t
GROUP BY id
HAVING count(*) =1
Petr,从评论来看,你想要一个组合 包括: ID只出现一次的所有行 ID多次出现的所有行以及记录上的所有其他字段都是相同的 排除: ID出现多次且其他字段不完全匹配的任何行
select ID, min(a) a, min(b) b
from YourTable
group by ID
having min(a) = max(a)
and min(b) = max(b)
如果除了a和b之外还有更多的列要比较,只需将各自的值添加到选择字段列表和相应的字段中。从您提供的数据示例中,查询返回的值将是
ID MIN(A) MIN(B) Having MIN(A) MAX(A) MIN(B) MAX(B)
1 2 3 2 2 3 3
2 8 7 8 8 7 7
3 9 10 9 20 10 12
因此,行ID=3将被抛出,因为have将在两列中的同一列的同一min和max上失败。然后,您可以将其复制到新表中。只有一次通过表…才能重建数据库,或者如果不能从原始数据库中重建一个新的数据库,将id作为主键?SQL可以处理其余部分。我很好奇,当您在SO搜索框中输入SQL删除重复行时,您发现了什么。你得到了我那四十页的结果了吗抱歉,无法抵抗刺拳:请看,第2行重复了两次,如下所示,而第1行没有重复两次,如下所示。这有点让人困惑,我想你的意思是下面只有第1行,或者可能是第1行和第3行?@Neil,我认为第2行幸存下来是因为内容完全相同。3被扔掉了,因为两个记录不同换句话说,如果所有副本都相同,请保留一份id副本,否则扔掉它,这可能会使我上面的简单评论不准确,因为这似乎是一个相当特殊的情况:-如果是这样的话,向Petr道歉。@paxdiablo那么为什么有1?@paxdiablo是的。这正是我想要的。相同的行仍然存在,但具有重复ID和不同其他字段的行将被删除。问题是该表必须包含所有行。筛选必须在选择数据时进行…@Petr你的问题是:“2。删除具有重复“id”字段的行。这令人困惑。我的意思是从SELECT结果中删除,而不是从表本身中删除。抱歉。@Petr,我已经更新了我的答案,但从选择结果中删除是一种奇怪的方式,可以说选择更少的行。这应该放在注释中,而不是答案中-