我有一个(大~1 000 000行)表,可能包含重复的行(可能的NULL值)。
我想做的是:
我们有一张桌子:
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的行。
我在考虑:
SELECT DISTINCT id, a, b FROM table
;只获得不同的行。最好的方法是什么?
答案 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出现多次的所有行 - 和记录中的所有其他字段是相同的
排除:
如果除a和b之外还有更多列进行比较,只需将相应的值添加到选择字段列表和相应的值即可。从您提供的数据样本中,查询返回的值将是 所以行ID = 3将被抛出,因为在两个BOTH列的相同列的相同min()和max()上,它将失败。然后,您可以将其复制到新表中。只有一个通过表... select ID, min(a) a, min(b) b
from YourTable
group by ID
having min(a) = max(a)
and min(b) = max(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
答案 2 :(得分:0)
您是否可以重建数据库,或者如果没有从原始数据库构建新数据库,并将id作为主键? SQL可以处理其余的事情。