2011-03-15 137 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