Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एक तालिका से रिकॉर्ड हटाना दूसरी तालिका में शामिल हो गया SQL

आपको 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 JOIN . का उपयोग करना चाहिए full table scan . के साथ स्वीकार्य प्रदर्शन प्राप्त करने के लिए दोनों टेबलों पर।

मूल रूप से दो विकल्प हैं DELETE . कैसे करें

अपडेट करने योग्य जॉइन व्यू

ध्यान दें कि इस मामले में आपकी छोटी तालिका पर एक अद्वितीय अनुक्रमणिका होनी चाहिए ID, VERSION (या प्राथमिक कुंजी)

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

इसके विपरीत बड़ी तालिका में ऐसी बाधा नहीं होनी चाहिए . यह महत्वपूर्ण है, क्योंकि यह स्पष्ट रूप से इंगित करता है कि आप केवल एक ही कुंजी संरक्षण तालिका . हैं सम्मिलित दृश्य में।

सरल छोटी तालिका में शामिल हों पंक्तियों को डुप्लिकेट नहीं कर सकते अद्वितीय अवरोध . के कारण बड़ी तालिका से

देखें यहां जॉइन व्यूज को अपडेट करने . के बारे में अधिक जानकारी

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
)

delete ऊपर BIG . से पंक्तियों को हटाता है तालिका क्योंकि यह एकमात्र कुंजी संरक्षण तालिका है (उपरोक्त चर्चा देखें)

यह DML एक HASH JOIN की ओर ले जाता है

EXISTS के साथ हटाएं

यदि आपकी छोटी तालिका में कोई प्राथमिक कुंजी नहीं है (अर्थात इसमें समान ID and VERSION के साथ डुप्लीकेट पंक्तियाँ हो सकती हैं ) आपको फ़ॉलबैक . करना होगा अन्य उत्तर में प्रस्तावित समाधान के लिए ।

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);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle के किसी अन्य उपयोगकर्ता को संग्रहीत कार्यविधि पर अधिकार प्रदान करना

  2. ओरेकल एसक्यूएल क्वेरी यूनियन ऑपरेशन?

  3. पीएल/एसक्यूएल में लूप का उपयोग किए बिना 1 से 10 कैसे प्रिंट करें?

  4. मुझे इस सीएलओबी क्षेत्र के गेटऑर्डिनल फ़ंक्शन में आउटऑफरेंज अपवाद क्यों मिलता है?

  5. एनएलएस पैरामीटर और उनकी प्राथमिकताएं निर्धारित करने के तरीके (ओरेकल डेटाबेस)