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

Oracle में शामिल होने के साथ मेरे अपडेट स्टेटमेंट में क्या गलत है?

अच्छा सवाल।

आपकी स्थिति का अनुकरण करने के लिए, मैंने नमूना तालिकाएँ बनाई हैं:

SQL> create table t_debtor(id_debtor,header)
  2  as
  3  select 1, 'Header 1' from dual union all
  4  select 2, null from dual union all
  5  select 3, 'Header 3' from dual
  6  /

Tabel is aangemaakt.

SQL> create table t_element (id_element,id_debtor,insurer)
  2  as
  3  select 1, 1, 'to be updated' from dual union all
  4  select 2, 1, 'to be updated' from dual union all
  5  select 3, 2, 'not to be updated' from dual union all
  6  select 4, 2, 'not to be updated' from dual union all
  7  select 5, 3, 'to be updated' from dual
  8  /

Tabel is aangemaakt.

और आपके वर्तमान अद्यतन विवरण के साथ, समस्या स्पष्ट हो जाती है:"अपडेट नहीं किया जाना चाहिए" मान NULL पर सेट हैं:

SQL> update
  2      T_ELEMENT elt
  3      set elt.INSURER = (
  4          select HEADER
  5              from T_DEBTOR debtor
  6              where
  7                  debtor.HEADER is not null
  8                  and debtor.ID_DEBTOR = elt.ID_DEBTOR)
  9  /

5 rijen zijn bijgewerkt.

SQL> select * from t_element
  2  /

ID_ELEMENT  ID_DEBTOR INSURER
---------- ---------- -----------------
         1          1 Header 1
         2          1 Header 1
         3          2
         4          2
         5          3 Header 3

5 rijen zijn geselecteerd.

इस अपडेट को करने का सबसे अच्छा तरीका है, दोनों टेबल्स के जॉइन को अपडेट करना। हालांकि कुछ प्रतिबंध हैं:

SQL> rollback
  2  /

Rollback is voltooid.

SQL> update ( select elt.insurer
  2                , dtr.header
  3             from t_element elt
  4                , t_debtor dtr
  5            where elt.id_debtor = dtr.id_debtor
  6              and dtr.header is not null
  7         )
  8     set insurer = header
  9  /
   set insurer = header
       *
FOUT in regel 8:
.ORA-01779: cannot modify a column which maps to a non key-preserved table

बाईपास ujvc संकेत के साथ, हम इस प्रतिबंध को दरकिनार कर सकते हैं। लेकिन ऐसा करना उचित नहीं है जब तक कि आप वास्तव में सुनिश्चित नहीं हैं कि t_debtor.id_debtor अद्वितीय है।

SQL> update /*+ bypass_ujvc */
  2         ( select elt.insurer
  3                , dtr.header
  4             from t_element elt
  5                , t_debtor dtr
  6            where elt.id_debtor = dtr.id_debtor
  7              and dtr.header is not null
  8         )
  9     set insurer = header
 10  /

3 rijen zijn bijgewerkt.

SQL> select * from t_element
  2  /

ID_ELEMENT  ID_DEBTOR INSURER
---------- ---------- -----------------
         1          1 Header 1
         2          1 Header 1
         3          2 not to be updated
         4          2 not to be updated
         5          3 Header 3

5 rijen zijn geselecteerd.

केवल प्राथमिक कुंजी जोड़ना बेहतर है। आपके पास शायद यह पहले से मौजूद होगा:

SQL> rollback
  2  /

Rollback is voltooid.

SQL> alter table t_debtor add primary key (id_debtor)
  2  /

Tabel is gewijzigd.

SQL> update ( select elt.insurer
  2                , dtr.header
  3             from t_element elt
  4                , t_debtor dtr
  5            where elt.id_debtor = dtr.id_debtor
  6              and dtr.header is not null
  7         )
  8     set insurer = header
  9  /

3 rijen zijn bijgewerkt.

SQL> select * from t_element
  2  /

ID_ELEMENT  ID_DEBTOR INSURER
---------- ---------- -----------------
         1          1 Header 1
         2          1 Header 1
         3          2 not to be updated
         4          2 not to be updated
         5          3 Header 3

5 rijen zijn geselecteerd.

सादर, रोब।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL संग्रहीत कार्यविधि तालिका में मान हाँ/नहीं की जाँच करने और sql निष्पादित करने के लिए

  2. वापसी पंक्तियाँ जिनमें Oracle में संख्यात्मक मान होते हैं

  3. Oracle REST डेटा सेवा एपेक्स_पु

  4. नेस्टेड कुल कार्य

  5. मैं पीएल/एसक्यूएल में JSON स्ट्रिंग को कैसे पार्स कर सकता हूं?