1

データベースから繰り返しユーザー情報を削除する必要があります。私の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);
4

3 に答える 3

2

次のように、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
于 2012-07-12T09:55:57.467 に答える
0

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;
于 2012-07-12T10:46:27.267 に答える
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

念のため、最初にデータのバックアップを取ってから、選択を削除に置き換えます

于 2012-07-12T09:54:04.750 に答える