現在有A B C 三張表,
A 表欄位 a b c 主鍵 a 自增;
B 表欄位 a d e 主鍵 a 根據 A 表生成 ;
C 表欄位 f a g 主鍵 f 自增,a 根據 A 表生成 ;
每個表都有重復資料,如何洗掉這些重復資料呢?
uj5u.com熱心網友回復:
給出測驗資料,和去重規則。uj5u.com熱心網友回復:
你這樣說,別人無法回答的。
需要提供原始資料和最終實作的效果,以及去重規則。
uj5u.com熱心網友回復:
主鍵都創建好了,重復資料插入的話會報錯的呀。給出你的資料以及你要的結果
uj5u.com熱心網友回復:
DELETE C WHERE ROWID IN (SELECT MAX(ROWID) FROM C GROUP BY F,A,G);DELETE B WHERE ROWID IN (SELECT MAX(ROWID) FROM B GROUP BY A,D,E);
DELETE A WHERE ROWID IN (SELECT MAX(ROWID) FROM A GROUP BY A,B,C);
COMMIT;
uj5u.com熱心網友回復:
你這3個delete陳述句,都是洗掉0條資料。
uj5u.com熱心網友回復:
個人觀點:去重盡量從rowid方向入手舉個例子:Oracle
構建資料
DROP TABLE t purge ;
CREATE TABLE t AS SELECT * FROM dba_objects WHERE rownum<=10;
UPDATE t SET object_id=rownum;
UPDATE t SET object_id=3 WHERE object_id<=3;
UPDATE t SET object_id=4 WHERE object_id>=4 AND object_id<=6;
COMMIT;
第一種根據 max(rowid) 或者 min(rowid)
delete from t
where rowid <
(select max(rowid) from t t2
where t.object_id = t2.object_id
);
第二種:
(注意,這里的寫法和上面的并不完全等價,上面是隨便洗掉,保留rowid最大一條,
下面是用分析函式,保留時間最新的,上面既然可以隨便刪了,下面的寫法肯定也是符合要求的。其中row_number必須要有order BY 關鍵字):
delete t
where rowid in (select rid
from (select rowid rid,
row_number() over(partition by object_id ORDER by created desc) rn
from t)
where rn > 1);
分解第二種方法:
SELECT object_id,rowid rid,
row_number() over(partition by object_id ORDER by created desc) rn
from t; --利用分析函式根據創建時間、object_id查詢最新記錄
SELECT object_id, rid,rn
FROM (select object_id,rowid rid,
row_number() over(partition by object_id ORDER by created desc) rn
from t)
where rn > 1;--查詢重復資料的rowid
delete t
where rowid in (select rid
from (select rowid rid,
row_number() over(partition by object_id ORDER by created desc) rn
from t)
where rn > 1); --根據rowid洗掉。。
完畢。。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/80599.html
標籤:開發
