如何编写查询以删除表中的重复项?

Joh*_* H. 3 sql t-sql

给出一个类似于这个的表,称为VehicleUser:

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

如何编写可以删除重复项的查询?除了不同的VehicleUserId之外,第2行和第3行与第1行相同,除了不同的VehicleUserId之外,第5行和第6行与4相同.

Rem*_*anu 6

;with cte as (
select row_number() over 
    (partition by VehicleId, UserId order by VehicleUserId) as rn
from VehicleUser)
delete from cte
where rn > 1;
Run Code Online (Sandbox Code Playgroud)


And*_*mar 5

您可以使用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
        )
Run Code Online (Sandbox Code Playgroud)

运行此之前,检查是否正常工作通过更换delete具有select:

select  *
from   VehicleUser v1
where  exists
       (
       ...
Run Code Online (Sandbox Code Playgroud)

显示的行将被删除.