oracle刪除重復(fù)記錄

1.1 查找表中多余的重復(fù)記錄

創(chuàng)新互聯(lián)建站10多年成都企業(yè)網(wǎng)站定制服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及高端網(wǎng)站定制服務(wù),成都企業(yè)網(wǎng)站定制及推廣,對搬家公司等多個方面擁有多年設(shè)計經(jīng)驗的網(wǎng)站建設(shè)公司。

--查詢出所有有重復(fù)的數(shù)據(jù)
select DETAIL_ID,COMMENT_BODY,count(1)
from BBSCOMMENT
group by DETAIL_ID,COMMENT_BODY
having count(1)>1; --1955條

select rownum,DETAIL_ID,COMMENT_BODY from
(select DETAIL_ID,COMMENT_BODY,(count(1) over (partition by DETAIL_ID,COMMENT_BODY)) rk
from BBSCOMMENT)
where rk > 1;

1.2 顯示了所有的非冗余的數(shù)據(jù)
--這一條命令顯示了所有的非冗余的數(shù)據(jù)
select min(COMMENT_ID) as COMMENT_ID,DETAIL_ID,COMMENT_BODY
from BBSCOMMENT
group by DETAIL_ID,COMMENT_BODY; --21453條,之所以此值不等于表總記錄數(shù)-1955,是因為1955條記錄中,有的重復(fù)了不止一次。
1.3 如果記錄數(shù)量少(千級別),可以把上面的語句做成子查詢?nèi)缓笾苯觿h除

--如果表數(shù)據(jù)量不是很大(1千條以內(nèi)),可以把上面的語句做成子查詢?nèi)缓笾苯觿h除
delete from BBSCOMMENT where COMMENT_ID not in(
select min(COMMENT_ID)
from BBSCOMMENT
group by DETAIL_ID,COMMENT_BODY
); --782秒,在我這里,2萬條記錄,重復(fù)記錄2千多(太慢了?。。?/p>

1.4 另一種刪除方法

--這條語句也能夠?qū)崿F(xiàn)上述功能,但不好測試了,數(shù)據(jù)已經(jīng)被我刪除了
--刪除條件一:有重復(fù)數(shù)據(jù)的記錄;條件二:保留最小rowid的記錄。
delete from BBSCOMMENT a
where
(a.DETAIL_ID,a.COMMENT_BODY) in(select DETAIL_ID,COMMENT_BODY from BBSCOMMENT group by DETAIL_ID,COMMENT_BODY having count(1) > 1)
and rowid not in (select min(rowid) from BBSCOMMENT group by DETAIL_ID,COMMENT_BODY having count(1)>1);

delete from BBSCOMMENT a
where rowid not in
(select min(row_id) from BBSCOMMENT group by DETAIL_ID,COMMENT_BODY);

注:rowid就是唯一標志記錄物理位置的一個id。oracle數(shù)據(jù)庫的表中的每一行數(shù)據(jù)都有一個唯一的標識符,或者稱為rowid,在oracle內(nèi)部通常就是使用它來訪問數(shù)據(jù)的。rowid需要 10個字節(jié)的存儲空間,并用18個字符來顯示。該值表明了該行在oracle數(shù)據(jù)庫中的物理具體位置??梢栽谝粋€查詢中使用rowid來表明查詢結(jié)果中包含該值。

1.5 大數(shù)據(jù)量還是用PL/SQL方便快捷

declare
--定義存儲結(jié)構(gòu)
type bbscomment_type is record
(
comment_id BBSCOMMENT.COMMENT_ID%type,
detail_id BBSCOMMENT.DETAIL_ID%type,
comment_body BBSCOMMENT.COMMENT_BODY%type
);
bbscomment_record bbscomment_type;

--可供比較的變量
v_comment_id BBSCOMMENT.COMMENT_ID%type;
v_detail_id BBSCOMMENT.DETAIL_ID%type;
v_comment_body BBSCOMMENT.COMMENT_BODY%type;

--其它變量
v_batch_size integer := 5000;
v_counter integer := 0;

cursor cur_dupl is
--取出所有有重復(fù)的記錄
select COMMENT_ID, DETAIL_ID, COMMENT_BODY
from BBSCOMMENT
where(DETAIL_ID, COMMENT_BODY) in (
--這些記錄有重復(fù)
select DETAIL_ID, COMMENT_BODY
from BBSCOMMENT
group by DETAIL_ID, COMMENT_BODY
having count(1) > 1)
order by DETAIL_ID, COMMENT_BODY;
begin
for bbscomment_record in cur_dupl loop
if v_detail_id is null or (bbscomment_record.detail_id != v_detail_id or nvl(bbscomment_record.comment_body, ' ') != nvl(v_comment_body, ' ')) then
--首次進入、換記錄了,都重新賦值
v_detail_id := bbscomment_record.detail_id;
v_comment_body := bbscomment_record.comment_body;
else
--其它記錄刪除
delete from BBSCOMMENT where COMMENT_ID = bbscomment_record.comment_id;
v_counter := v_counter + 1;

        if mod(v_counter, v_batch_size) = 0 then
            --每多少條提交一次
            commit;
        end if;
    end if;
end loop;

if v_counter > 0 then
    --最后一次提交
    commit;
end if;

dbms_output.put_line(to_char(v_counter)||'條記錄被刪除!');

exception
when others then
dbms_output.put_line('sqlerrm-->' ||sqlerrm);
rollback;
end;

網(wǎng)站題目:oracle刪除重復(fù)記錄
當前URL:http://muchs.cn/article16/isgjdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、定制網(wǎng)站、網(wǎng)站設(shè)計網(wǎng)站制作、、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計