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