2011-03-15 141 views
0

我在表中有userid和角色id字段。在那張桌子上,userid有兩個角色。但它不應該。刪除重複記錄?

例如:

Userid(FK) RoleID(FK) 
1    1E36A840-2EBB-44EC-8861-0E3D262AC676 
1    0B54F223-E0D4-4CFC-84C3-7C98C1BFC6DA 
2    1E36A840-2EBB-44EC-8861-0E3D262AC676 
3    0B54F223-E0D4-4CFC-84C3-7C98C1BFC6DA 
4    1E36A840-2EBB-44EC-8861-0E3D262AC676 
4    0B54F223-E0D4-4CFC-84C3-7C98C1BFC6DA 

在這種情況下,我必須刪除1和4,其中 '1E36A840-2EBB-44EC-8861-0E3D262AC676' 具有 '0B54F223-E0D4-4CFC-84C3-7C98C1BFC6DA'

+0

你如何決定哪些保持的作用? – 2011-03-15 20:17:18

+0

爲什麼不應該有一個用戶有多個角色? – David 2011-03-15 20:17:33

+0

桌子的PK是什麼? – Thomas 2011-03-15 20:19:07

回答

0

您可以通過在Userid列上添加一個唯一約束來防止這種情況發生。但是,在執行此操作之前,您需要刪除現有的重複項。鑑於我們迄今爲止的信息(一個Userid和一個Roleid)真的沒有辦法「正確」做到這一點。正如@Joe Stefanelli在他的評論中提到的,你需要決定哪個角色對每個用戶來說都是「正確」的角色。這聽起來像一個手動過程。 (除非事先知道每種情況下只保留第一個,在這種情況下@Thomas的答案很好。)

出於好奇,有沒有一個特定的原因,爲什麼用戶不能(或者在這種情況下不應該)有多個角色?通常這就是角色的作用,以多對多的方式向不同的用戶應用多個權限集等等。從面向對象的設計角度考慮它。角色是接口(類型),用戶是類(實現)。通過擁有多個角色,每個用戶可以在整個系統中多態化爲多個用戶類型。

0

假設你正在使用SQL Server 2005及更高版本和假設我們有一個主鍵列(在這個例子叫PKCol),並假設它並不重要的角色ID被刪除:

With Dups As 
    (
    Select PKCol 
     , Row_Number() Over(Partition By UserId Order By PKCol) As Num 
    From Table 
    ) 
Delete MyTable 
From MyTable As T1 
    Join Dups As T2 
     On T2.PKCol = T1.PKCol 
Where T2.Num > 1