海量資料處理_刪除重複行
經常會遇到需要刪除重複行的問題,以下給出可選方案:
--0,案例
drop table t;
create table t(
a int,
b int
);
insert into t values(1,1);
insert into t values(1,1);
insert into t values(1,1);
insert into t values(2,2);
commit;
--1,經典方法
--適用於小表
delete from t
where rowid not in(select min(rowid) from t group by a);
--2,分析函式
--適用於大表,要刪除極少量資料時
delete from t
where rowid in(
select rd from
(select rowid rd,a,row_number() over(partition by a order by rowid) rn from t)
where rn>1
);
--3,表函式
--適用於大表,要刪除大量資料時;並行能加快嗎?
-- Define the ref cursor types and function
CREATE OR REPLACE PACKAGE filter_rows_pkg IS
TYPE refcur_t IS REF CURSOR RETURN t%ROWTYPE;
TYPE outrec_typ IS RECORD (
a int,
b int);
TYPE outrecset IS TABLE OF outrec_typ;
FUNCTION f_trans(p refcur_t)
RETURN outrecset PARALLEL_ENABLE PIPELINED;
END filter_rows_pkg;
/
CREATE OR REPLACE PACKAGE BODY filter_rows_pkg IS
current_value int := null;
FUNCTION f_trans(p refcur_t)
RETURN outrecset PARALLEL_ENABLE PIPELINED IS
out_rec outrec_typ;
in_rec p%ROWTYPE;
BEGIN
LOOP
FETCH p INTO in_rec;
EXIT WHEN p%NOTFOUND;
if current_value is null or current_value<>in_rec.a then
current_value := in_rec.a;
out_rec.a := in_rec.a;
out_rec.b := in_rec.b;
PIPE ROW(out_rec);
elsif current_value = in_rec.a then
null;
else
null;
end if;
END LOOP;
CLOSE p;
RETURN;
END;
END filter_rows_pkg;
/
create table t_new
as
select * from table(filter_rows_pkg.f_trans(cursor(select * from t order by a)));
--4,exception table
create table myexceptions(row_id rowid,
owner varchar2(30),
table_name varchar2(30),
constraint varchar2(30));
alter table t
add constraint pk_t primary key(a) disable novalidate;
alter table t
modify constraint pk_t enable validate exceptions into myexceptions;
select * from myexceptions;
--包含所有行
delete from t where rowid in(
select row_id from myexceptions
minus
(select min(rowid) from t group by a)
);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18922393/viewspace-696654/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 刪除重複資料
- MS SQL Server 刪除重複行資料SQLServer
- mongodb刪除重複資料MongoDB
- MySQL刪除重複資料MySql
- 刪除表裡重複資料
- sqlserver中刪除重複資料SQLServer
- SQL刪除重複資料,只保留一行SQL
- 處理表重複記錄(查詢和刪除)
- MySQL 處理重複資料MySql
- Oracle 重複資料處理Oracle
- PostgreSQL刪除表中重複資料SQL
- 解析postgresql 刪除重複資料案例SQL
- 海量資料處理
- 海量資料表刪除方案
- Oracle查詢重複資料與刪除重複記錄Oracle
- 資料處理之去除重複資料
- T-SQL 刪除重複資料SQLSQL
- 根據rowid刪除重複資料
- 通過ROWID刪除重複資料
- Oracle中刪除重複資料的SqlOracleSQL
- mysql 刪除表中重複的資料MySql
- excel刪除重複資料保留一條 如何刪掉重複資料只留一條Excel
- oracle刪除多餘重複行Oracle
- mysql查詢表裡的重複資料方法和刪除重複資料MySql
- Oracle查詢重複資料與刪除重複記錄方法Oracle
- 海量資料處理2
- 海量資料處理 (轉)
- 海量資料處理_表分割槽(線上重定義)
- ORACLE批量刪除無主鍵重複資料Oracle
- Python 字串,list排序,刪除重複資料Python字串排序
- Mongodb 刪除重複資料的幾個方法MongoDB
- oracle重複資料的查詢及刪除Oracle
- oracle 刪除重複資料的幾種方法Oracle
- Oracle 刪除重複資料只留一條Oracle
- 刪除重複資料的幾個方法(轉)
- Oracle中刪除表中的重複資料Oracle
- 海量資料處理_批量插入
- 海量資料處理_批量更新