在工作中遇到一個只保留一條數(shù)據(jù),刪除其余重復(fù)數(shù)據(jù)的問題晰绎,特此記錄一下寓落。
在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)在要對重復(fù)數(shù)據(jù)進行去重尖昏,但是要保留一條數(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
可以這樣寫:
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