在工作中遇到一个只保留一条数据,删除其余重复数据的问题,特此记录一下。
在qx_ry_gw(人员与岗位的关系表)
中,主要有ry_dm(人员代码)
和gw_dm(岗位代码)
字段。
ry_dm(人员代码) | gw_dm(岗位代码) | lrrq(录入日期) | lrr_dm(录入人代码) |
---|---|---|---|
ry1 | gw1 | 2023-05-23 | 1 |
ry1 | gw1 | 2023-05-23 | 1 |
ry2 | gw1 | 2023-05-23 | 1 |
ry2 | gw2 | 2023-05-23 | 1 |
ry2 | gw3 | 2023-05-23 | 1 |
ry2 | gw3 | 2023-05-23 | 1 |
ry2 | gw3 | 2023-05-23 | 1 |
可以看到,表中有几条重复数据,现在要对重复数据进行去重,但是要保留一条数据。
删除后的数据应该是这样:
ry_dm(人员代码) | gw_dm(岗位代码) | lrrq(录入日期) | lrr_dm(录入人代码) |
---|---|---|---|
ry1 | gw1 | 2023-05-23 | 1 |
ry2 | gw1 | 2023-05-23 | 1 |
ry2 | gw2 | 2023-05-23 | 1 |
ry2 | gw3 | 2023-05-23 | 1 |
那么删除的SQL
可以这样写:
delete from qx_ry_gw t
where (t.ry_dm,t.gw_dm) in
(select a.ry_dm,a.gw_dm from qx_ry_gw a
group by a.ry_dm,a.gw_dm
having count(*) > 1)
and rowid not in
(select min(rowid) from qx_ry_gw b
group by b.ry_dm,b.gw_dm
having count(*) > 1);
SQL解析:
- 根据
ry_dm(人员代码)
和gw_dm(岗位代码)
,筛选出重复数据;
(t.ry_dm,t.gw_dm) in (select a.ry_dm,a.gw_dm from qx_ry_gw a group by a.ry_dm,a.gw_dm having count(*) > 1)
- 排除
rowid
最小的数据;
and rowid not in (select min(rowid) from qx_ry_gw b group by b.ry_dm,b.gw_dm having count(*) > 1)
- 删除筛选后的数据。
delete from qx_ry_gw t