Πίνακας 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
δοκιμάστε το
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);
Εδώ φαίνεται να υπάρχει μια ακόμη καλύτερη απάντηση με ρήτρα '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" ),