удалить дубликаты записей? - PullRequest
0 голосов
/ 15 марта 2011

У меня есть поля идентификатора пользователя и роли в таблице.В этой таблице пара 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 '

Ответы [ 2 ]

0 голосов
/ 15 марта 2011

Предполагая, что вы используете 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
0 голосов
/ 15 марта 2011

Вы можете предотвратить это в первую очередь, установив уникальное ограничение на столбец Userid. Однако перед этим вам нужно будет удалить существующие дубликаты. Учитывая имеющуюся у нас информацию (а Userid и Roleid), на самом деле нет способа "правильно" сделать это. Как отметил @Joe Stefanelli в своем комментарии, вам нужно решить, какая роль является «правильной» для каждого пользователя. Это звучит как ручной процесс. (Если вы заранее не знаете, что в каждом случае должен храниться только первый, в этом случае @Thomas имеет хороший ответ.)

Из любопытства, есть ли конкретная причина, по которой пользователь не может (или не должен в этом случае) иметь несколько ролей? Обычно это то, для чего нужны роли, применение множества наборов разрешений и т. Д. Для разных пользователей способом «многие ко многим». Думайте об этом с точки зрения объектно-ориентированного дизайна. Роли - это интерфейсы (типы), а пользователи - это классы (реализации). Имея несколько ролей, каждый пользователь может превратиться в несколько типов пользователей по всей системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...