2012-07-12 49 views
1

我只需要从数据库中删除重复的用户信息。我的C#代码如下,但我只是想知道如何在SQL中实现而不使用游标。我认为这个诀窍从获取由电子邮件分隔的整个重复数据集的第一行或其余行开始。删除重复数据C#到SQL转换

在C#中,我收集1000组的电子邮件,并跳过第一个删除剩余的行。

List<string> top1000_emails; 
do 
{ 
    top1000_emails = sql.dbCommand.GetFirstColumn<string>(@"select top 1000 email 
     from UserBase 
     group by email 
     having COUNT(email) > 1"); 

    for (int i = 0; i < top1000_emails.Count; i++) 
    { 
    var tmpids = sql.dbCommand.GetFirstColumn<long>("select [Id] from UserBase where email = {0}", top1000_emails[i]).Skip(1); 
    sql.dbCommand.DeleteByIds<UserBase>(tmpids); 
    } 
} while (top1000_emails.Count > 0); 
+0

因此,您的观点是保留一个截然不同的电子邮件记录并删除任何其他重复记录?它可以在SQL查询中完成,我不认为你需要那个C#代码。 – 2012-07-12 09:42:49

+0

准确地说,我只需要保留不同的电子邮件并删除其他重复。那么我怎么能在没有光标的sql中执行操作。因为如果我使用了光标,它将与我的c#代码相同 – 2012-07-12 09:46:30

+1

表中是否有任何唯一标识? – Kashif 2012-07-12 09:58:02

回答

2

你可以做TI只需通过SQL ,像这样(如果你有SQL Server 2005或更高版本):

;WITH a AS (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY email ORDER BY Id) RowNum 
    FROM UserBase 
) 
-- deleted rows will be: 
SELECT * 
--DELETE 
FROM a 
WHERE a.RowNum <> 1 
+0

如果他正在使用SQL Server 2005或更高版本! – Kashif 2012-07-12 09:56:54

+0

@MuhammadKashifNadeem好点 – 2012-07-12 09:59:39

+0

不错的查询thnx很多。 – 2012-07-12 11:28:32

0

事情是这样的......

--delete userbase 
select * 
from userbase 
    left join (select email, MIN(id) minid from userbase group by email) mins 
    on userbase.id = mins.minid 
    and userbase.email = mins.email 
where mins.email is null 

把你的数据备份第一,以防万一 然后用替代选择删除

0

假设你h ave主键ID,在您的UserBase表中。创建UserBase_Unique表精确结构作为UserBase表并运行以下命令。 UserBase_Unique表将有你正在寻找的结果。

INSERT INTO UserBase_Unique (ID,Email) 

SELECT Min(ID) 
FROM UserBase AS U 
WHERE Exists (SELECT email, Count(ID) 
FROM UserBase U2 
WHERE U2.email= U2.email 
GROUP BY email 
HAVING Count(U2.ID) > 1) 
GROUP BY email;