在工作中遇到一個(gè)只保留一條數(shù)據(jù),刪除其余重復(fù)數(shù)據(jù)的問(wèn)題,特此記錄一下。
在qx_ry_gw(人員與崗位的關(guān)系表)中,主要有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 |
可以看到,表中有幾條重復(fù)數(shù)據(jù),現(xiàn)在要對(duì)重復(fù)數(shù)據(jù)進(jìn)行去重,但是要保留一條數(shù)據(jù)。
刪除后的數(shù)據(jù)應(yīng)該是這樣:
| 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可以這樣寫(xiě):
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解析:
- 根據(jù)
ry_dm(人員代碼)和gw_dm(崗位代碼),篩選出重復(fù)數(shù)據(jù);
(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最小的數(shù)據(jù);
and rowid not in (select min(rowid) from qx_ry_gw b group by b.ry_dm,b.gw_dm having count(*) > 1)
- 刪除篩選后的數(shù)據(jù)。
delete from qx_ry_gw t