Выбор / удаление дубликатов - PullRequest
3 голосов
/ 22 февраля 2012

У меня есть таблица ниже CatItemLink с записями в ней:

ID                                      CatID                                   ItemID
--------------------------------------------------------------------------------------------------------------------
ADBFBEFE-11F4-4CF0-A889-BBC9358CCF57    A411277E-0873-4323-B016-63F4DFA664C2    B66A47DF-A0E3-4D41-88E9-0B0CB27085D7
->E212A458-E5E2-4D77-B618-425082CFD8D2  A411277E-0873-4323-B016-63F4DFA664C2    B66A47DF-A0E3-4D41-88E9-0B0CB27085D7

D071B1C1-7296-4BCA-8AD3-8495704BF679    A411277E-0873-4323-B016-63F4DFA664C2    E288327C-15BF-4B01-BD37-0B6AD5365966
->B4F59516-2D85-4E2A-8FE4-3EDA27C3DA4F  A411277E-0873-4323-B016-63F4DFA664C2    E288327C-15BF-4B01-BD37-0B6AD5365966
->F3FB6BA5-79EC-4FC5-899E-24FA9F8DFF25  A411277E-0873-4323-B016-63F4DFA664C2    E288327C-15BF-4B01-BD37-0B6AD5365966

CF3FBD01-4445-4A72-AD1A-BF397970AEFC    BFB76F3D-4F06-4200-925D-1968666741A3    E288327C-15BF-4B01-BD37-0B6AD5365966

ID - это первичный ключ.[CatID, ItemID] должен был быть уникальным индексом, но DBO не указывал этот индекс.Как удалить / выбрать записи, отмеченные ->, то есть будет только один ItemID на CatID.(ItemID можно найти с разными CatID, и это нормально).

У меня есть решение, которое использует SET ROWCOUNT, но я хочу иметь альтернативу.

Ответы [ 2 ]

4 голосов
/ 22 февраля 2012
;WITH x AS 
( 
  SELECT ID, rn = ROW_NUMBER() OVER 
  (PARTITION BY CatID, ItemID ORDER BY ID)
  FROM dbo.CatItemLink
)
DELETE x WHERE rn > 1;
3 голосов
/ 22 февраля 2012
SELECT ID AS IDsToDelete
FROM  (SELECT ID, Row_number() OVER (partition BY catid, itemid ORDER BY id) AS Dup
       FROM   CatItemLink ) a
WHERE  dup > 1

Я думаю, что это выберет то, что вы хотите. Это разделит таблицу по столбцам CatID и ItemID и эффективно присвоит каждой строке ранг (т. Е. При наличии дубликатов ей будет присвоен ранг выше 1).

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