C# 删除重复数据C到SQL转换
我只需要从数据库中删除重复的用户信息。下面是我的c代码,但我只是想知道如何在SQL中实现这一点,而不是不使用游标。我认为技巧是从获取电子邮件分隔的整个重复数据集的第一行或剩余行开始的 在C语言中,我按1000人一组收集重复的电子邮件,并在跳过第一行后删除剩余的行C# 删除重复数据C到SQL转换,c#,sql-server,C#,Sql Server,我只需要从数据库中删除重复的用户信息。下面是我的c代码,但我只是想知道如何在SQL中实现这一点,而不是不使用游标。我认为技巧是从获取电子邮件分隔的整个重复数据集的第一行或剩余行开始的 在C语言中,我按1000人一组收集重复的电子邮件,并在跳过第一行后删除剩余的行 List<string> top1000_emails; do { top1000_emails = sql.dbCommand.GetFirstColumn<string>(@"select top 100
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);
像这样的
--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
先备份数据,以防万一
然后用delete替换select您可以简单地通过SQL执行ti,如果您有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
假设您的UserBase表中有主键ID。创建UserBase_Unique Table结构作为UserBase Table并运行以下命令。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;
那么,您的目的是保留一个不同的电子邮件记录,并删除任何其他重复记录?这可以在SQL查询中完成,我认为您不需要那个C代码。确切地说,我只需要保留不同的电子邮件并删除其他重复的邮件。所以,在没有游标的SQL中我该怎么做。因为如果我使用游标,它将与我的C代码相同。表中是否有唯一的Id?如果他使用的是SQL Server 2005或更高版本!