日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了刪除連接到另一個表SQL的一個表中的記錄的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我有兩個表,一個包含211,000條記錄(不推薦使用的記錄),另一個包含10,500,000條記錄

我想在id和versionnumber字段上連接這兩個表,因為這兩個表都有這些字段。我希望從連接表中刪除匹配的記錄(來自連接表),即從10,500,000條記錄中刪除所有212,000條記錄

我想知道使用Oracle SQL解決此問題的最佳方法是什么?我已經看到了
示例中,已使用單個字段使用內部聯接,并且已使用DELETE語句從表2中刪除表1,但未看到使用了兩個字段的表1(在聯接中)。

在刪除記錄之前使用外部聯接是否有意義?我在想,如果可能的話,這可能會幫助我追蹤被刪除的內容

推薦答案

您不需要使用OUTER JOIN,只需檢查將分別顯示多少行。不會被刪除嗎。

此類查詢的示例見下文(我使用答案末尾提供的生成測試數據)

with del as (
select delta.id, delta.version,
decode(big.id,null,0,1) is_deleted
from delta
left outer join big 
on delta.id = big.id and delta.version = big.version
)
select is_deleted, count(*) cnt, max(id||'.'||version) eg_id_vers
from del
group by is_deleted;

IS_DELETED        CNT  EG_ID_VERS                                                                   
---------- ---------- ----------
         1      20000 99995.0   
         0         20 100100.0   

對于您的數據大小,您應該在兩個表上使用HASH JOINWITHfull table scan以獲得可接受的性能。

執行DELETE操作基本上有兩種選擇

可更新聯接視圖

請注意,在這種情況下,您的小表必須在ID, VERSION上有唯一索引(或主鍵)

create unique index delta_idx on delta(id,version);

相反,大表不應該有這樣的約束。這一點很重要,因為它清楚地表明您的大表是聯接視圖中唯一一個保留鍵的表

由于UNIQUE約束

,對小表的簡單PUT聯接無法復制大表中的行

請參閱here有關更新聯接視圖的詳細信息

delete from 
(
select delta.id, delta.version, big.id big_id, big.version
from big 
join delta 
on delta.id = big.id and delta.version = big.version
)

上面的deleteBIG表中刪除行,因為這是唯一的保留鍵的表(請參閱上面的討論)

此DML通向HASH JOIN

刪除With Existes

如果您的小表沒有主鍵(即它可以包含具有相同ID and VERSION的重復行),則必須后備到other answer中建議的解決方案。

DELETE FROM big 
    WHERE EXISTS (SELECT null
                  FROM delta
                  WHERE delta.id = big.id and delta.version = big.version
                 ) 

不需要索引,您應該期待HASH JOIN RIGHT SEMI的執行計劃,這意味著這兩種方法并不是真的不同。

測試樣本數據

create table big as
select 
trunc(rownum/10) id, mod(rownum,10) version,
lpad('x',10,'Y') pad
from dual connect by level <= 1000000;

/* the DELTA table has 50 times less rows,
allow some rows out of range of the BIG table - those rows will not be deleted **/
drop table delta;
create table delta as
select 
trunc(rownum*50/10) id, mod(rownum*50,10) version
from dual connect by level <= 1001000/50;

create unique index delta_idx on delta(id,version);

這篇關于刪除連接到另一個表SQL的一個表中的記錄的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標簽:errorDeletingrecordsfromonetablejoinedontoanothertableSQL exception IT
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定