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

समूह समारोह के साथ Oracle अद्यतन विवरण

आपके पास प्रत्येक तालिका में दो रिकॉर्ड हैं जहां area है 01 , और आपको प्राथमिक कुंजी को संतुष्ट करने के लिए उन्हें अलग-अलग मानों पर सेट करने की आवश्यकता है - आप उन दोनों को दूसरी तालिका से अधिकतम या न्यूनतम मान पर सेट नहीं कर सकते हैं, इसलिए आप वास्तव में कोई समूह नहीं करना चाहते हैं।

ऐसा लगता है कि समान area . वाले रिकॉर्ड के बीच कोई अन्य क्रम नहीं है , इसलिए मैं मान लूंगा कि यह मनमाना है और इससे कोई फ़र्क नहीं पड़ता कि प्रत्येक area के लिए कौन सा रिकॉर्ड है कौन सा branch_code प्राप्त करता है दूसरी टेबल से। यदि यह मनमाना नहीं है तो नियमों को निर्दिष्ट करने की आवश्यकता होगी...

एक सहसंबद्ध अद्यतन मुश्किल है यदि आपको अभिलेखों के समूह के भीतर एक मनमाना क्रम पर मिलान करने की आवश्यकता है। आपको पंक्ति क्रम की पहचान करने के लिए किसी तरह की आवश्यकता है, लेकिन एक row_number() adding जोड़ना इनलाइन दृश्य बनाने के लिए मूल तालिका में कॉलम से ORA-01732 त्रुटि उत्पन्न होगी।

हालांकि, आप लक्ष्य तालिका के rowid . का उपयोग कर सकते हैं छद्म स्तंभ; नए branch_code के साथ समान मान प्राप्त करने के लिए आपको बस सहसंबंध में एक अतिरिक्त जुड़ाव करना होगा . कुछ इस तरह:

select bc.rid,
  bc.area,
  bc.branch_code,
  bc.branch_name,
  bc2.area,
  bc2.branch_code,
  bc2.branch_name
from (
  select bc.*,
    bc.rowid as rid,
    row_number() over (partition by bc.area order by bc.branch_code) as rn
  from branch_cp bc
) bc
join (
  select bc2.*,
    row_number() over (partition by bc2.area order by bc2.branch_code) as rn
  from branch_cp_2 bc2
) bc2
on bc2.area = bc.area
and bc2.rn = bc.rn;

जो आपको देता है:

RID                AREA  BRANCH_CODE BRANCH_NAME AREA  BRANCH_CODE BRANCH_NAME
------------------ ----- ----------- ----------- ----- ----------- -----------
AAAwy+AAEAAAA0DAAA 01    01          A           01    04          D           
AAAwy+AAEAAAA0DAAB 01    02          B           01    05          E           
AAAwy+AAEAAAA0DAAC 03    03          C           03    06          F           

अब आपको वास्तव में उन सभी स्तंभों की आवश्यकता नहीं है, आपको केवल rid . की आवश्यकता है (branch_cp.rowid ) और सहसंबद्ध branch_cp_2.branch_code

लेकिन आप केवल तभी अपडेट करना चाहते हैं जब कोई मैच हो - किसी भी पंक्ति को शून्य करने के लिए जहां अन्य तालिका में कोई मूल्य नहीं है - इसलिए आपको दोहराना होगा कि exists में शामिल हों सबक्वेरी।

merge करना आसान है :

merge into branch_cp bc
using (
  select bc.rid,
      bc2.branch_code
    from (
      select bc.*,
        bc.rowid as rid,
        row_number() over (partition by bc.area order by bc.branch_code) as rn
      from branch_cp bc
    ) bc
    join (
      select bc2.*,
        row_number() over (partition by bc2.area order by bc2.branch_code) as rn
      from branch_cp_2 bc2
    ) bc2
    on bc2.area = bc.area
    and bc2.rn = bc.rn
) bc2
on (bc.rowid = bc2.rid)
when matched then update set bc.branch_code = bc2.branch_code;

3 rows merged.

आपकी तालिका में अब है:

select * from branch_cp;

AREA  BRANCH_CODE BRANCH_NAME
----- ----------- -----------
01    04          A           
01    05          B           
03    06          C           

SQL Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल में अल्फान्यूमेरिक अनुक्रम जेनरेटर होना संभव है

  2. ODP.NET कनेक्शन पूलिंग:कैसे बताएं कि क्या कनेक्शन का उपयोग किया गया है

  3. कर्सर के साथ क्या गलत है?

  4. क्या रूबी में कोई nvl () फ़ंक्शन है या क्या मुझे इसे स्वयं लिखना है?

  5. जेबॉस पर ओरेकल एडीएफ:लपेटा हुआ जेडीबीसी कनेक्शन समस्या