删除重复的行#2

时间:2011-01-27 12:40:20

标签: sql sqlite duplicates distinct

我有一个(大~1 000 000行)表,可能包含重复的行(可能的NULL值)。

我想做的是:

  1. 仅选择distinc行。
  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的行。

    我在考虑:

    1. SELECT DISTINCT id, a, b FROM table;只获得不同的行。
    2. 以某种方式过滤(1)的结果以删除重复的ID。
    3. 最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

第三回答现在问题更清楚了:

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

答案 1 :(得分:0)

Petr,根据评论看起来,你想要一个COMBINATION ......

包括:    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将被抛出,因为在两个BOTH列的相同列的相同min()和max()上,它将失败。然后,您可以将其复制到新表中。只有一个通过表...

答案 2 :(得分:0)

您是否可以重建数据库,或者如果没有从原​​始数据库构建新数据库,并将id作为主键? SQL可以处理其余的事情。