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

时间:2011-01-25 16:21:13

标签: sql tsql

给出一个类似于这个的表,叫做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相同。

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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
        )

在您运行此操作之前,请将delete替换为select来检查它是否有效:

select  *
from   VehicleUser v1
where  exists
       (
       ...

显示的行将被删除。

答案 2 :(得分:3)

这是您独特的价值观:

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

您可以在删除任何内容之前将它们放在新表中以确保您拥有所需内容,然后删除vehicleUser或使用外部联接从vehicleUser中删除不在新表中的行。

删除行之前进行调试更安全。

答案 3 :(得分:1)

我认为你不能完全在一个查询中做到这一点。

我会进行分组查询以查找重复项,然后迭代结果,删除除第一个VehicleUserId行以外的所有行。

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

将为您提供重复的VehicleId / UserId组合。