ORACLE 在缺少主鍵ID的情況下刪除重複資料,只保留一行

合法勒索夫發表於2024-03-26

有時候因未進行資料驗證或其他特殊場景,導致資料表中出現重複的資料,需要對重複資料進行刪除,並且只保留其中一條。

一、當資料表存在主鍵時,可使用 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;

相關文章