Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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
C# 删除重复数据C到SQL转换_C#_Sql Server - Fatal编程技术网

C# 删除重复数据C到SQL转换

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

我只需要从数据库中删除重复的用户信息。下面是我的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);
像这样的

 --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或更高版本!