2012-07-12 52 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;