Как мне написать запрос на удаление дубликатов в таблице? - PullRequest
3 голосов
/ 25 января 2011

Учитывая таблицу, похожую на эту, называемую VehicleUser:

VehicleUserId | VehicleId | UserId
1 | 1001 | 2
2 | 1001 | 2
3 | 1001 | 2
4 | 1001 | 3
5 | 1001 | 3
6 | 1001 | 3

Как мне написать запрос, который может удалить дубликаты? строки 2 и 3 идентичны строке 1 за исключением другого VehicleUserId, а строки 5 и 6 идентичны 4 за исключением другого VehicleUserId.

Ответы [ 4 ]

6 голосов
/ 25 января 2011
;with cte as (
select row_number() over 
    (partition by VehicleId, UserId order by VehicleUserId) as rn
from VehicleUser)
delete from cte
where rn > 1;
5 голосов
/ 25 января 2011

Вы можете отфильтровать дубликаты с помощью предложения exists, например:

delete  v1
from    VehicleUser v1
where   exists
        (
        select  *
        from    VehicleUser v2
        where   v1.VehicleId = v2.VehicleId
                and v1.UserId = v2.UserId
                and v1.VehicleUserId > v2.VehicleUserId
        )

Перед запуском проверьте, работает ли он, заменив delete на select:

select  *
from   VehicleUser v1
where  exists
       (
       ...

Отображаемые строки будут удалены.

3 голосов
/ 25 января 2011

вот ваши уникальные значения:

select vehicleid, userid, min(vehicleuserid) as min_id
from vehicleuser
group by vehicleid, userid

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

Отладка перед удалением строк безопаснее.

1 голос
/ 25 января 2011

Не думаю, что вы можете сделать это чисто в одном запросе.

Я бы сделал групповой запрос, чтобы найти дубликаты, а затем повторил бы результаты, удалив все, кроме первой строки VehicleUserId.

select VehicleId, UserId
from VehicleUser
group by VehicleId, UserId
having count(*) > 1

Получит вам комбинации VehicleId / UserId, для которых есть дубликаты.

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