有時候因未進行資料驗證或其他特殊場景,導致資料表中出現重複的資料,需要對重複資料進行刪除,並且只保留其中一條。
一、當資料表存在主鍵時,可使用 ROW_NUMBER 進行排序後刪除,參考指令碼如下:
刪除帶有主鍵的重複資料
DELETE FROM DUPLICATES_TABLE
WHERE ID IN (
SELECT ID
FROM (
SELECT ID,
ROW_NUMBER() OVER (PARTITION BY COLUMN1, COLUMN2 ORDER BY ID) AS ROW_NUM
FROM DUPLICATES_TABLE
)
WHERE ROW_NUM > 1 --只保留第一行,刪除其餘同ID的重複行
);
二、當資料表缺少主鍵時,可使用 ROWID 進行排序後刪除,參考指令碼如下:
刪除前建議先備份
-- 備份
CREATE TABLE MY_TMNL_EQUIP_PARAM_BACK AS
SELECT TB.* FROM MY_TMNL_EQUIP_PARAM TB
JOIN (
SELECT T.OPER_ID,
T.PARA_ID,
COUNT(T.OPER_ID) SL
FROM MY_TMNL_EQUIP_PARAM T
WHERE T.PARA_ID IN
(SELECT B.CSBS
FROM SB_FKZDCS B)
GROUP BY T.OPER_ID, T.PARA_ID
HAVING COUNT(T.OPER_ID) > 1
ORDER BY T.OPER_ID DESC
) TA ON TB.OPER_ID=TA.OPER_ID AND TB.PARA_ID=TA.PARA_ID;
遍歷批次刪除
--刪除
BEGIN
FOR TTT IN ( --查詢出重複資料
SELECT T.OPER_ID,
T.PARA_ID,
COUNT(T.OPER_ID) SL
FROM MY_TMNL_EQUIP_PARAM T
WHERE T.PARA_ID IN
(SELECT B.CSBS
FROM SB_FKZDCS B)
GROUP BY T.OPER_ID, T.PARA_ID
HAVING COUNT(T.OPER_ID) > 1
ORDER BY T.OPER_ID DESC
)
LOOP --遍歷刪除(只保留每組重複的第一條)
--DBMS_OUTPUT.put_line(TTT.OPER_ID);
DELETE FROM MY_TMNL_EQUIP_PARAM T WHERE T.OPER_ID=TTT.OPER_ID
AND ROWID<> --只保留第一行,刪除其餘相同重複行
(
SELECT MIN(ROWID) FROM MY_TMNL_EQUIP_PARAM T1 WHERE T1.OPER_ID=TTT.OPER_ID
);
END LOOP;
COMMIT;
END;