Oracle如何刪除表中重複記錄保留第一條
問題描述:
有一張表因為沒有加重複判斷,導致會有些重複資料存在,現在需要根據重複規則去掉重複的記錄,只保留第一條。
解決方案:
方案1:採用rowid的方式
DELETE FROM tmp101 A WHERE ROWID NOT IN (SELECT MIN(ROWID) FROM tmp101 b WHERE A.col1 = b.col1 AND A.col2 = b.col2 AND A.col3 = b.col3 AND A.col4 = b.col4);
如果表中沒有外來鍵約束,上述方式可以很好的解決。如果有外來鍵的話可能會遇到如下問題。
這部分記錄已經在別的表裡面有引用了,如果要刪除,需要先刪除子表中的資料。
-- 刪除子表 delete from tmp1011 where col in( select col FROM tmp101 A WHERE ROWID NOT IN (SELECT MIN(ROWID) FROM tmp101 b WHERE A.col1 = b.col1 AND A.col2 = b.col2 AND A.col3 = b.col3 AND A.col4 = b.col4)); -- 刪除主表 DELETE FROM tmp101 A WHERE ROWID NOT IN (SELECT MIN(ROWID) FROM tmp101 b WHERE A.col1 = b.col1 AND A.col2 = b.col2 AND A.col3 = b.col3 AND A.col4 = b.col4);
方案2:採用row_number()over(partition by order by)
-- 刪除子表 DELETE FROM tmp1011 WHERE col IN ( SELECT col FROM ( SELECT col,col1,col2,col3,col4 row_number()OVER(PARTITION BY col1,col2,col3,col4 ORDER BY col) rn FROM tmp101) WHERE rn <> 1 ); -- 刪除主表 DELETE FROM tmp101 WHERE col IN ( SELECT col FROM ( SELECT col,col1,col2,col3,col4 row_number()OVER(PARTITION BY col1,col2,col3,col4 ORDER BY col) rn FROM tmp101) WHERE rn <> 1 );
如果資料量大導致的刪除困難,記得加下迴圈。
-- 按照日期進行迴圈 DECLARE bdate DATE; edate DATE; BEGIN edate := TRUNC(SYSDATE); SELECT NVL(TRUNC(MIN(col5)),TRUNC(SYSDATE)) INTO bdate FROM tmp101; WHILE bdate < edate LOOP DELETE FROM tmp1011 WHERE col IN ( SELECT col FROM ( SELECT col,col1,col2,col3,col4 row_number()OVER(PARTITION BY col1,col2,col3,col4 ORDER BY col) rn FROM tmp101 WHERE col5 >= bdate AND col5 < bdate + 1) WHERE rn <> 1 ); COMMIT; bdate := bdate + 1; END LOOP; END; /
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69903557/viewspace-2750010/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL刪除重複記錄並保留第一條MySql
- sql刪除重複記錄只保留一條SQL
- Mysql語句查詢指定重複記錄和刪除重複記錄僅保留一條【親測可以】MySql
- excel刪除重複資料保留一條 如何刪掉重複資料只留一條Excel
- Oracle中刪除表中的重複資料Oracle
- 刪除重複id的記錄
- 刪除oracle重複值Oracle
- MariaDB刪除重複記錄效能測試
- PostgreSQL刪除表中重複資料SQL
- mysql 刪除表中重複的資料MySql
- mysql刪除一條記錄MySql
- SqlServer中根據某幾列獲取重複的資料將其刪除並保留最新一條SQLServer
- MySQL資料庫中刪除重複記錄的方法總結[推薦]MySql資料庫
- sqlserver中刪除重複資料SQLServer
- JavaScript刪除字串中重複字元JavaScript字串字元
- ORACLE批量刪除無主鍵重複資料Oracle
- ORACLE 在缺少主鍵ID的情況下刪除重複資料,只保留一行Oracle
- mysql 刪除重複項MySql
- JavaScript 刪除重複字元JavaScript字元
- 刪除重複資料
- 刪除排序陣列中的重複項排序陣列
- mongodb刪除重複資料MongoDB
- VSCode刪除重複的空行VSCode
- JavaScript 刪除字串重複字元JavaScript字串字元
- oracle刪除重資料方法Oracle
- mysql支援跨表delete刪除多表記錄MySqldelete
- C# 批次刪除Excel中的重複行C#Excel
- ES6刪除字串中重複的元素字串
- 刪除有序陣列中的重複項 II陣列
- 刪除字串中的所有相鄰重複項字串
- 如何在 Linux 中刪除目錄Linux
- JavaScript陣列刪除重複元素JavaScript陣列
- JavaScript 刪除陣列重複元素JavaScript陣列
- Remove Duplicate Letters 刪除重複元素REM
- 如何在 Linux 中找到並刪除重複檔案Linux
- c#刪除有序陣列中的重複項C#陣列
- 題目:刪除排序陣列中的重複項排序陣列
- 使用Java Stream API中DistinctBy刪除重複資料JavaAPI