删除重复记录?
问题描述:
我在表中有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'
答
您可以通过在Userid
列上添加一个唯一约束来防止这种情况发生。但是,在执行此操作之前,您需要删除现有的重复项。鉴于我们迄今为止的信息(一个Userid
和一个Roleid
)真的没有办法“正确”做到这一点。正如@Joe Stefanelli在他的评论中提到的,你需要决定哪个角色对每个用户来说都是“正确”的角色。这听起来像一个手动过程。 (除非事先知道每种情况下只保留第一个,在这种情况下@Thomas的答案很好。)
出于好奇,有没有一个特定的原因,为什么用户不能(或者在这种情况下不应该)有多个角色?通常这就是角色的作用,以多对多的方式向不同的用户应用多个权限集等等。从面向对象的设计角度考虑它。角色是接口(类型),用户是类(实现)。通过拥有多个角色,每个用户可以在整个系统中多态化为多个用户类型。
答
假设你正在使用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
你如何决定哪些保持的作用? – 2011-03-15 20:17:18
为什么不应该有一个用户有多个角色? – David 2011-03-15 20:17:33
桌子的PK是什么? – Thomas 2011-03-15 20:19:07