Oracle SQL: Update tabel dengan data dari tabel lain

Tabel 1:

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

Tabel 2:

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

Di oracle SQL, bagaimana cara menjalankan aplikasi sql update query yang dapat update Tabel 1 dengan Tabel 2's nama dan desc menggunakan id? Sehingga hasil akhir yang saya dapatkan adalah

Tabel 1:

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

Pertanyaan ini diambil dari https://stackoverflow.com/questions/5036918/sql-update-query-with-data-from-another-table tapi khusus untuk oracle SQL.

Mengomentari pertanyaan (5)
Larutan

Ini disebut berkorelasi update

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 )

Dengan asumsi bergabung dengan hasil yang di kunci-diawetkan lihat, anda juga bisa

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
Komentar (9)

Coba ini:

MERGE INTO table1 t1
USING
(
-- For more complicated queries you can use WITH clause here
SELECT * FROM table2
)t2
ON(t1.id = t2.id)
WHEN MATCHED THEN UPDATE SET
t1.name = t2.name,
t1.desc = t2.desc;
Komentar (4)

mencoba

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);
Komentar (1)

Di sini tampaknya menjadi yang lebih baik menjawab dengan 'di' klausul yang memungkinkan untuk beberapa tombol untuk bergabung:

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

Lengkap contoh berikut: http://forums.devshed.com/oracle-development-96/how-to-update-from-two-tables-195893.html

Daging sapi memiliki kolom yang ingin anda gunakan sebagai kunci dalam tanda kurung di mana klausa sebelum 'di' dan pilih pernyataan yang sama dengan nama kolom dalam tanda kurung. di mana (column1,column2) dalam ( pilih (column1,column2) dari tabel di mana "saya ingin" );

Komentar (0)
Update table set column = (select...)

pernah bekerja untuk saya sejak ditetapkan hanya mengharapkan 1 nilai - SQL Error: ORA-01427: single-row subquery menghasilkan lebih dari satu baris.

berikut ini's solusi:

BEGIN
For i in (select id, name, desc from table1) 
LOOP
Update table2 set name = i.name, desc = i.desc where id = i.id;
END LOOP;
END;

Yang's bagaimana tepatnya anda jalankan di SQLDeveloper lembar kerja. Mereka mengatakan itu's lambat tapi yang's satu-satunya solusi yang bekerja untuk saya pada hal ini.

Komentar (6)

Jika meja anda t1 dan's cadangan t2 memiliki banyak kolom, di sini's cara yang kompak untuk melakukannya.

Selain itu, saya terkait masalah itu hanya beberapa kolom yang dimodifikasi dan banyak baris yang tidak memiliki suntingan untuk kolom ini, jadi saya ingin meninggalkan mereka sendirian - pada dasarnya mengembalikan subset kolom dari cadangan dari seluruh tabel. Jika anda hanya ingin mengembalikan semua baris, melewatkan klausa where.

Tentu saja cara yang lebih sederhana akan menghapus dan menyisipkan serta memilih, tapi dalam kasus saya, saya membutuhkan solusi dengan hanya update.

Kuncinya adalah bahwa ketika anda melakukan select * from sepasang tabel dengan kolom duplikat nama, ke-2 akan mendapatkan yang bernama _1. Jadi di sini's apa yang saya datang dengan:

  update (
    select * from t1 join t2 on t2.id = t1.id
    where id in (
      select id from (
        select id, col1, col2, ... from t2
        minus select id, col1, col2, ... from t1
      )
    )
  ) set col1=col1_1, col2=col2_1, ...
Komentar (1)
BEGIN
For i in (select id, name, desc from table2) 
LOOP
Update table1 set name = i.name, desc = i.desc where id = i.id and (name is null or desc is null);
END LOOP;
END;
Komentar (0)