Sql 如何删除重复行
某些行共享相同的主键ID,但该行的其余部分可能不同。比如说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 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匹配但年龄不匹配的行。这不会删除所有三列都相同的行。