Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除重复的行2_Sql_Sqlite_Duplicates_Distinct - Fatal编程技术网

Sql 删除重复的行2

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的行被删除 我在想:

我有一个大的~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的结果以删除重复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,我已经更新了我的答案,但从选择结果中删除是一种奇怪的方式,可以说选择更少的行。这应该放在注释中,而不是答案中-