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
- Oracle如何刪除表中重複記錄Oracle
- sql刪除重複記錄只保留一條SQL
- 高效快速刪除Oracle表中重複記錄Oracle
- Oracle 刪除表中重複記錄的DELETE SQLOracledeleteSQL
- 刪除Oracle重複記錄Oracle
- oracle刪除重複記錄Oracle
- 查詢刪除表中重複記錄
- Mysql語句查詢指定重複記錄和刪除重複記錄僅保留一條【親測可以】MySql
- excel刪除重複資料保留一條 如何刪掉重複資料只留一條Excel
- mysql表刪除重複記錄方法MySql
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- Oracle使用over()partition by刪除重複記錄Oracle
- oracle-快速刪除重複的記錄Oracle
- Oracle查詢重複資料與刪除重複記錄Oracle
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄) 轉Oracle
- 【轉】oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- Oracle刪重複記錄Oracle
- Oracle中刪除表中的重複資料Oracle
- Oracle查詢重複資料與刪除重複記錄方法Oracle
- 刪除重複id的記錄
- MYSQL中刪除重複記錄的方法薦MySql
- 處理表重複記錄(查詢和刪除)
- mysql刪除重複記錄,儲存Id最小的一條MySql
- 在SQL Server中快速刪除重複記錄(轉)SQLServer
- DB2 刪除重複記錄DB2
- oracle 查詢及刪除表中重複資料Oracle
- 轉載:Oracle中查詢和刪除重複記錄方法簡介Oracle
- sql server 中刪除內容重複的某條記錄SQLServer
- PostgreSQL刪除表中重複資料SQL
- MySQL刪除表重複記錄的三種方法舉例MySql
- db2中刪除重複記錄的問題DB2
- Oracle 刪除重複資料只留一條Oracle
- db2刪除重複的記錄DB2
- Oracle 使用分析函式刪除表中的重複行Oracle函式
- Oracle 查詢並刪除重複記錄的SQL語句OracleSQL
- 如何刪除oracle庫中相同的記錄Oracle
- 刪除oracle重複值Oracle