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.
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
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" );
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.
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, ...
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;