删除重复记录?

时间:2011-03-15 20:15:06

标签: sql sql-server tsql

我在表格中有userid和role id字段。在该表中,一对用户ID具有两个角色。但它不应该。

示例:

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'

2 个答案:

答案 0 :(得分:0)

您可以通过在Userid列上添加唯一约束来防止这种情况发生。但是,在执行此操作之前,您需要删除现有的重复项。鉴于我们到目前为止的信息(UseridRoleid),实际上没有办法“正确”地做到这一点。正如@Joe Stefanelli在评论中提到的那样,你需要确定每个用户的“正确”角色。这听起来像是一个手动过程。 (除非你事先知道在每种情况下都应该保留第一个,所以@Thomas有一个很好的答案。)

出于好奇,是否有一个特定的原因导致用户不能(或不应该,在这种情况下)有多个角色?通常,这是角色的用途,以多对多的方式将多个权限集等应用于各种用户。从面向对象设计的角度来考虑它。角色是接口(类型),用户是类(实现)。通过拥有多个角色,每个用户可以在整个系统中多态化为多种用户类型。

答案 1 :(得分:0)

假设您正在使用SQL Server 2005及更高版本,并假设我们有一个主键列(在此示例中称为PKCol)并假设删除哪个RoleId无关紧要:

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