Oracle SQL: Ενημέρωση ενός πίνακα με δεδομένα από έναν άλλο πίνακα

Πίνακας 1:

id    name    desc
-----------------------
1     a       abc
2     b       def
3     c       adf

Πίνακας 2:

id    name    desc
-----------------------
1     x       123
2     y       345

Στην SQL του Oracle, πώς μπορώ να εκτελέσω ένα ερώτημα sql update που μπορεί να ενημερώσει τον πίνακα 1 με το όνομα και το desc του πίνακα 2'χρησιμοποιώντας το ίδιο id; Έτσι το τελικό αποτέλεσμα που θα έπαιρνα είναι

Πίνακας 1:

id    name    desc
-----------------------
1     x       123
2     y       345
3     c       adf

Η ερώτηση προέρχεται από το https://stackoverflow.com/questions/5036918/sql-update-query-with-data-from-another-table, αλλά ειδικά για την Oracle SQL.

Λύση

Αυτό ονομάζεται συσχετισμένη ενημέρωση

UPDATE table1 t1
   SET (name, desc) = (SELECT t2.name, t2.desc
                         FROM table2 t2
                        WHERE t1.id = t2.id)
 WHERE EXISTS (
    SELECT 1
      FROM table2 t2
     WHERE t1.id = t2.id )

Υποθέτοντας ότι η ένωση οδηγεί σε μια προβολή διατηρημένη με κλειδί, θα μπορούσατε επίσης να

UPDATE (SELECT t1.id, 
               t1.name name1,
               t1.desc desc1,
               t2.name name2,
               t2.desc desc2
          FROM table1 t1,
               table2 t2
         WHERE t1.id = t2.id)
   SET name1 = name2,
       desc1 = desc2
Σχόλια (9)

δοκιμάστε το

UPDATE Table1 T1 SET
T1.name = (SELECT T2.name FROM Table2 T2 WHERE T2.id = T1.id),
T1.desc = (SELECT T2.desc FROM Table2 T2 WHERE T2.id = T1.id)
WHERE T1.id IN (SELECT T2.id FROM Table2 T2 WHERE T2.id = T1.id);
Σχόλια (1)

Εδώ φαίνεται να υπάρχει μια ακόμη καλύτερη απάντηση με ρήτρα 'in' που επιτρέπει πολλαπλά κλειδιά για την ένωση:

update fp_active set STATE='E', 
   LAST_DATE_MAJ = sysdate where (client,code) in (select (client,code) from fp_detail
  where valid = 1) ...

Το πλήρες παράδειγμα είναι εδώ: http://forums.devshed.com/oracle-development-96/how-to-update-from-two-tables-195893.html

Το βόειο κρέας είναι στο να έχετε τις στήλες που θέλετε να χρησιμοποιήσετε ως κλειδί σε παρένθεση στη ρήτρα where πριν το 'in' και να έχετε την εντολή select με τα ίδια ονόματα στηλών σε παρένθεση. where (column1,column2) in ( select (column1,column2) from table where "the set I want" ),

Σχόλια (0)