Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 如何删除重复行_Sql_Duplicates - Fatal编程技术网

Sql 如何删除重复行

Sql 如何删除重复行,sql,duplicates,Sql,Duplicates,某些行共享相同的主键ID,但该行的其余部分可能不同。比如说 ID Age Info 2 21 2763 2 21 6276 3 31 82756 在本例中,第一行和第二行的ID和年龄相同,但信息不同。我想对重复的ID行做的是随机保留其中一行,删除其他行。我的数据集中有这么多这样的记录,所以我无法逐个删除它们。有什么解决办法吗?谢谢我想你在找这样的东西: delete from TableName where info not in (select

某些行共享相同的主键ID,但该行的其余部分可能不同。比如说

ID   Age   Info
2    21    2763
2    21    6276
3    31    82756

在本例中,第一行和第二行的ID和年龄相同,但信息不同。我想对重复的ID行做的是随机保留其中一行,删除其他行。我的数据集中有这么多这样的记录,所以我无法逐个删除它们。有什么解决办法吗?谢谢

我想你在找这样的东西:

delete from TableName where info not in 
(select min(info) from TableName group by ID,Age);
首先尝试select语句以确保返回正确的行,然后将delete部分添加到该语句中

DELETE t1
FROM mytable AS t1
INNER JOIN mytable AS t2 
ON t1.ID = t2.ID AND t1.Age = t2.Age AND t1.Info > t2.Info
以上应该在MySQL、SQL Server中工作。该语句删除ID、年龄切片中的所有行,但不删除具有最小信息值的行


注意:如果每个ID、年龄段的信息值都是唯一的,则上述方法有效。

我会建议一种基于集合的解决方案,但我无法处理所有3行都相同的行。因此,建议使用ROWCOUNT和while循环的解决方案。行计数将确保一次只删除1条记录。while循环非常简单,因此您不必逐个手动执行

SET ROWCOUNT 1

DECLARE @ctr INT
SELECT TOP 1 @ctr = COUNT(*) FROM table GROUP BY ID HAVING COUNT(*) > 1 ORDER BY COUNT(*) desc
SELECT @ctr
WHILE @ctr > 1
BEGIN
    DELETE FROM table WHERE ID IN (SELECT ID FROM table GROUP BY ID HAVING COUNT(*) > 1)
    SELECT @ctr = NULL
    SELECT TOP 1 @ctr = COUNT(*) FROM table GROUP BY ID HAVING COUNT(*) > 1 ORDER BY COUNT(*) desc
If @Ctr IS NULL
    Break
ELSE
    Continue
END
SET ROWCOUNT 0
您可以更改delete语句中的order by子句以满足您的要求。

使用窗口功能:

;with cte as(select *, row_number() over(partition by id order by info) rn 
             from table)
delete from cte where rn <> 1

此表中的主键是哪个?@Adish PK在本例中是ID。ThanksHow PK是否允许重复值?无论如何,你想删除重复的ID,对吗?还是必须将ID和年龄的组合视为重复?@Adish Remove duplicate IDs对于我的案例来说已经足够好了谢谢您使用MySQL、SQL Server、Oracle吗?让我试试!谢谢你的回复!仅当信息唯一时,此操作才有效。ID=2,Info=82756的行会将其丢弃。正确,根据示例的假设是,每个分组ID和年龄的信息都是唯一的。对于此查询,工作信息在表级别上必须是唯一的是,它适用于示例,但在我的实际情况中,信息不是唯一的。很抱歉,我举了一个不好的例子。谢谢你的回答,t1和t2是什么?@GavinNiu它们是表别名这不会删除ID匹配但年龄不匹配的行。这不会删除所有三列都相同的行。