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 )
);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923980/viewspace-2676483/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 刪除重複資料
- Oracle中刪除表中的重複資料Oracle
- ORACLE 在缺少主鍵ID的情況下刪除重複資料,只保留一行Oracle
- 刪除oracle重複值Oracle
- mongodb刪除重複資料MongoDB
- oracle刪除重資料方法Oracle
- mybatis oracle資料庫批次插入資料,忽略主鍵重複MyBatisOracle資料庫
- sqlserver中刪除重複資料SQLServer
- 解析postgresql 刪除重複資料案例SQL
- PostgreSQL刪除表中重複資料SQL
- mysql 刪除表中重複的資料MySql
- MS SQL Server 刪除重複行資料SQLServer
- excel刪除重複資料保留一條 如何刪掉重複資料只留一條Excel
- 事件溯源投影模式:重複資料刪除策略 - domaincentric事件模式AI
- 使用Java Stream API中DistinctBy刪除重複資料JavaAPI
- 主鍵可以重複?
- mysql 刪除重複項MySql
- JavaScript 刪除重複字元JavaScript字元
- 6.12php對資料庫的刪除和批量刪除PHP資料庫
- 【常用方法推薦】如何刪除MySQL的重複資料?MySql
- mysql刪除主鍵索引,刪除索引語法MySql索引
- Laravel 批量插入(如果資料存在刪除原資料)Laravel
- oracle主鍵序列的建立,刪除,修改序列起始值Oracle
- VSCode刪除重複的空行VSCode
- JavaScript 刪除字串重複字元JavaScript字串字元
- MySQL 批量更新、刪除資料shell指令碼MySql指令碼
- Oracle如何刪除表中重複記錄保留第一條Oracle
- oracle adg主庫通過rman無法刪除歸檔Oracle
- 批量刪除MSSQL 中主外來鍵約束SQL
- JavaScript陣列刪除重複元素JavaScript陣列
- JavaScript 刪除陣列重複元素JavaScript陣列
- Remove Duplicate Letters 刪除重複元素REM
- 刪除重複id的記錄
- JavaScript刪除字串中重複字元JavaScript字串字元
- mysql-刪除和新增主鍵MySql
- 主鍵的建立、新增、刪除操作
- [Oracle]Oracle資料庫資料被修改或者刪除恢復資料Oracle資料庫
- 【北亞資料恢復】誤刪除oracle表和誤刪除oracle表資料的資料恢復方法資料恢復Oracle