久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

ORACLE中怎么批量刪除無主鍵重復數據

146次閱讀
沒有評論

共計 2116 個字符,預計需要花費 6 分鐘才能閱讀完成。

這篇文章給大家介紹 ORACLE 中怎么批量刪除無主鍵重復數據,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

1. 需求說明

TEST 表情況說明:

按月進行分區的分區表

未定義主鍵或唯一索引

包含 COL1,COL2,COL3,INSERTTIME 四列

現需要刪除 2019 年 3 月 31 日當天存在的重復數據

2. 解決方法 2.1 確認無重復數據的記錄數

SELECT COUNT(1) FROM ( SELECT COL1,COL2,COL3,INSERTTIME FROM TEST PARTITION(P201903) A 
 WHERE INSERTTIME  = DATE 2019-03-31  AND INSERTTIME   DATE 2019-04-01 
 GROUP BY COL1,COL2,COL3
);

2.2 梳理需要篩選的數據

由于原表 A 數據量特別大,此處新建一張表將需要處理的數據單獨存放

CREATE TABLE TEST_TMP NOLOGGING AS
SELECT /*PARALLEL +8 */ A.*,A.ROWID ROWID_OLD FROM TEST PARTITION(P201903) A 
 WHERE INSERTTIME  = DATE 2019-03-31  AND INSERTTIME   DATE 2019-04-01

2.2 確認需要刪除的數據

理論上而言需要刪除和需要保留的數據記錄數應相等

-- 需要刪除的數據記錄數  
SELECT COUNT(1) FROM TEST PARTITION(P201903) A WHERE ROWID IN ( SELECT MIN(ROWID_OLD) ROWID_OLD FROM TEST_TMP 
 WHERE INSERTTIME  = DATE 2019-03-31  AND INSERTTIME   DATE 2019-04-01  
 GROUP BY COL1,COL2,COL3,INSERTTIME 
 HAVING COUNT(1)   1)
AND INSERTTIME  = DATE 2019-03-31  AND INSERTTIME   DATE 2019-04-01 
-- 需要保留的數據記錄數  
SELECT COUNT(1) FROM TEST PARTITION(P201903) A WHERE ROWID NOT IN ( SELECT MIN(ROWID_OLD) ROWID_OLD FROM TEST_TMP 
 WHERE INSERTTIME  = DATE 2019-03-31  AND INSERTTIME   DATE 2019-04-01  
 GROUP BY COL1,COL2,COL3,INSERTTIME 
 HAVING COUNT(1)   1)
AND INSERTTIME  = DATE 2019-03-31  AND INSERTTIME   DATE 2019-04-01

2.3 利用分批提交刪除重復數據

DECLARE
 TYPE ROWID_LIST IS TABLE OF UROWID INDEX BY BINARY_INTEGER;
 ROWID_INFOS ROWID_LIST;
 I NUMBER;
 CURSOR C_ROWIDS IS (SELECT MIN(ROWID_OLD) ROWID_OLD
 FROM TEST_TMP 
 WHERE INSERTTIME  = DATE 2019-03-31  AND INSERTTIME   DATE 2019-04-01  
 GROUP BY COL1,COL2,COL3,INSERTTIME
 HAVING COUNT(1)   1);
 BEGIN
 OPEN C_ROWIDS;
 LOOP
 -- 此處 LIMIT 后的值為分批提交的記錄數,可以根據實際情況調整
 FETCH C_ROWIDS BULK COLLECT INTO ROWID_INFOS LIMIT 10000;
 FORALL I IN 1..ROWID_INFOS.COUNT
 -- 如下的 DELETE 語句為分批提交實際需要執行的部分
 DELETE FROM TEST WHERE ROWID=ROWID_INFOS(I);
 COMMIT;
 EXIT WHEN ROWID_INFOS.COUNT 10000;
 END LOOP;
 CLOSE C_ROWIDS;
 END;

2.4 確認無重復數據

SELECT * FROM ( SELECT COL1,COL2,COL3,INSERTTIME FROM TEST PARTITION(P201903) A 
 WHERE INSERTTIME  = DATE 2019-03-31  AND INSERTTIME   DATE 2019-04-01 
 GROUP BY COL1,COL2,COL3,INSERTTIME
 HAVING COUNT(1) 1 )
);

關于 ORACLE 中怎么批量刪除無主鍵重復數據就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-03發表,共計2116字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 南陵县| 广汉市| 澄江县| 从化市| 石柱| 安西县| 二手房| 大港区| 来安县| 梅河口市| 孝义市| 大竹县| 安达市| 崇义县| 湘乡市| 寻乌县| 惠东县| 龙南县| 仙游县| 句容市| 塔河县| 富宁县| 福建省| 普安县| 新乡市| 金沙县| 泰宁县| 平乐县| 景洪市| 乐都县| 临邑县| 松阳县| 安义县| 孝昌县| 阿城市| 仁怀市| 兰溪市| 阿拉善右旗| 八宿县| 邹城市| 新巴尔虎左旗|