溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

oracle刪除重復記錄

發布時間:2020-07-23 22:27:44 來源:網絡 閱讀:1223 作者:小陳子057 欄目:關系型數據庫

1.1 查找表中多余的重復記錄

--查詢出所有有重復的數據
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 顯示了所有的非冗余的數據
--這一條命令顯示了所有的非冗余的數據
select min(COMMENT_ID) as COMMENT_ID,DETAIL_ID,COMMENT_BODY
from BBSCOMMENT
group by DETAIL_ID,COMMENT_BODY; --21453條,之所以此值不等于表總記錄數-1955,是因為1955條記錄中,有的重復了不止一次。
1.3 如果記錄數量少(千級別),可以把上面的語句做成子查詢然后直接刪除

--如果表數據量不是很大(1千條以內),可以把上面的語句做成子查詢然后直接刪除
delete from BBSCOMMENT where COMMENT_ID not in(
select min(COMMENT_ID)
from BBSCOMMENT
group by DETAIL_ID,COMMENT_BODY
); --782秒,在我這里,2萬條記錄,重復記錄2千多(太慢了?。。?/p>

1.4 另一種刪除方法

--這條語句也能夠實現上述功能,但不好測試了,數據已經被我刪除了
--刪除條件一:有重復數據的記錄;條件二:保留最小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數據庫的表中的每一行數據都有一個唯一的標識符,或者稱為rowid,在oracle內部通常就是使用它來訪問數據的。rowid需要 10個字節的存儲空間,并用18個字符來顯示。該值表明了該行在oracle數據庫中的物理具體位置??梢栽谝粋€查詢中使用rowid來表明查詢結果中包含該值。

1.5 大數據量還是用PL/SQL方便快捷

declare
--定義存儲結構
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
--取出所有有重復的記錄
select COMMENT_ID, DETAIL_ID, COMMENT_BODY
from BBSCOMMENT
where(DETAIL_ID, COMMENT_BODY) in (
--這些記錄有重復
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;

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女