oracle刪除重復(fù)記錄

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

創(chuàng)新互聯(lián)建站10多年成都企業(yè)網(wǎng)站定制服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及高端網(wǎng)站定制服務(wù),成都企業(yè)網(wǎng)站定制及推廣,對(duì)搬家公司等多個(gè)方面擁有多年設(shè)計(jì)經(jīng)驗(yàn)的網(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,是因?yàn)?955條記錄中,有的重復(fù)了不止一次。
1.3 如果記錄數(shù)量少(千級(jí)別),可以把上面的語(yǔ)句做成子查詢?nèi)缓笾苯觿h除

--如果表數(shù)據(jù)量不是很大(1千條以內(nèi)),可以把上面的語(yǔ)句做成子查詢?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萬(wàn)條記錄,重復(fù)記錄2千多(太慢了?。。?/p>

1.4 另一種刪除方法

--這條語(yǔ)句也能夠?qū)崿F(xiàn)上述功能,但不好測(cè)試了,數(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就是唯一標(biāo)志記錄物理位置的一個(gè)id。oracle數(shù)據(jù)庫(kù)的表中的每一行數(shù)據(jù)都有一個(gè)唯一的標(biāo)識(shí)符,或者稱為rowid,在oracle內(nèi)部通常就是使用它來(lái)訪問(wèn)數(shù)據(jù)的。rowid需要 10個(gè)字節(jié)的存儲(chǔ)空間,并用18個(gè)字符來(lái)顯示。該值表明了該行在oracle數(shù)據(jù)庫(kù)中的物理具體位置??梢栽谝粋€(gè)查詢中使用rowid來(lái)表明查詢結(jié)果中包含該值。

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

declare
--定義存儲(chǔ)結(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
--首次進(jìn)入、換記錄了,都重新賦值
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ù)記錄
當(dāng)前URL:http://bm7419.com/article16/isgjdg.html

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

廣告

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

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