Удаление дубликатов на основе «группировки»? - PullRequest
1 голос
/ 18 ноября 2010

В настоящее время у меня отношения один-ко-многим с пользователями и изображениями профилей, которые мне нужно изменить, чтобы они соответствовали отношениям один-к-одному.

У меня есть таблица Users, а затем таблица ImageReference с UserID.

Мне нужно, чтобы для каждого пользователя, имеющего более одной связанной записи ImageReference, удалите все записи ImageReference, КРОМЕ для самой последней.

Таким образом, если у пользователя есть две ссылки на изображения, одна с идентификатором 100, а другая с идентификатором 150, мне нужно удалить одну с идентификатором 100.

Есть идеи, как лучше всего это сделать?

Ответы [ 3 ]

0 голосов
/ 18 ноября 2010

Вы пробовали что-то вроде

SELECT  UserID,
        MAX(ImageRefID) LastUserImageID
FROM    UserImages
GROUP BY UserID

Если эта схема должна измениться на 1-1, вам, вероятно, следует включить ImageRedID в таблицу Users.

Используя Sql Server 2005, вы также можете удалить их из таблицы напрямую.

Посмотрите на следующий пример.

DECLARE @UserImages TABLE(
        ImageRefID INT,
        UserID INT
)

INSERT INTO @UserImages SELECT 1, 1
INSERT INTO @UserImages SELECT 2, 2
INSERT INTO @UserImages SELECT 3, 1
INSERT INTO @UserImages SELECT 4, 1

;WITH Vals AS (
        SELECT  UserID,
                ImageRefID,
                ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY ImageRefID DESC) RowID
        FROM    @UserImages
)
DELETE
FROM    Vals 
WHERE   RowID > 1

SELECT  *
FROM    @UserImages
0 голосов
/ 18 ноября 2010
delete from ImageReference where ImgID in (
select ImgID
from ImageReference ir
  join (select UserID, max(ImgID) as MaxImgID
   from ImageReference
   group by UserID) MaxImgIDPerUser
 on ir.UserID = MaxImgIDPerUser.UserID
where ir.ImgID < MaxImgIDPerUser.MaxImgID)
0 голосов
/ 18 ноября 2010

Вставьте все последние строки ImageReference (выберите максимальную группировку идентификаторов по идентификатору пользователя) во временную таблицу, затем оставьте соединение с этой таблицей обратно в таблицу ImageReference, удалите те строки, которые не объединяются (где ImageReference.ID равен нулю),

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