Tabel 1:
id name desc
-----------------------
1 a abc
2 b def
3 c adf
Meja 2:
id name desc
-----------------------
1 x 123
2 y 345
Di oracle SQL, bagaimana cara menjalankan kueri pembaruan sql yang dapat memperbarui Tabel 1 dengan Tabel 2 name
dan desc
menggunakan yang sama id
? Jadi hasil akhirnya yang akan saya dapatkan adalah
Tabel 1:
id name desc
-----------------------
1 x 123
2 y 345
3 c adf
Pertanyaan diambil dari memperbarui satu tabel dengan data dari yang lain , tetapi khusus untuk Oracle oracle.
sql
oracle
sql-update
Muhd
sumber
sumber
Jawaban:
Ini disebut pembaruan berkorelasi
Dengan asumsi hasil gabungan dalam tampilan yang dipertahankan kunci, Anda juga bisa
sumber
WHERE EXISTS
mencegah Anda memperbarui barist1
jika tidak ada baris yang cocokt2
. Tanpa itu, setiap baris dit1
akan diperbarui dan nilai-nilai akan ditetapkanNULL
jika tidak ada baris yang cocok dit2
. Itu umumnya bukan apa yang Anda inginkan terjadi sehinggaWHERE EXISTS
umumnya diperlukan.SELECT ... FROM t2
harus menghasilkan baris yang unik. Ini berarti bahwa Anda harus memilih pada semua bidang yang terdiri dari kunci unik - kunci primer non-unik tidak cukup. Tanpa keunikan, Anda direduksi menjadi sesuatu seperti loop @ PaulKarr - dan jika tidak ada korelasi unik, maka lebih dari satu baris target dapat diperbarui untuk setiap baris sumber.table2
) mengembalikan beberapa baris untuk satutable1
nilai atau lebih dan Oracle tidak tahu yang mana yang ingin Anda gunakan. Biasanya, itu berarti Anda harus memperbaiki subquery sehingga mengembalikan satu baris yang berbeda.Coba ini:
sumber
table1
dantable2
merupakan tabel yang sama, hanya mengurus -partON
danWHERE
-clause untukSELECT
-Statement oftable2
!mencoba
sumber
tidak pernah bekerja untuk saya karena set hanya mengharapkan 1 nilai - SQL Error: ORA-01427: subquery baris tunggal mengembalikan lebih dari satu baris.
inilah solusinya:
Begitulah tepatnya Anda menjalankannya di lembar kerja SQLDeveloper. Mereka bilang itu lambat tapi itu satu-satunya solusi yang bekerja untuk saya dalam kasus ini.
sumber
Tampaknya ada jawaban yang lebih baik dengan klausa 'in' yang memungkinkan beberapa kunci untuk bergabung :
Daging sapi memiliki kolom yang ingin Anda gunakan sebagai kunci dalam tanda kurung di mana klausa sebelum 'dalam' dan memiliki pernyataan pilih dengan nama kolom yang sama dalam tanda kurung. di mana ( kolom1, kolom2 ) di ( pilih ( kolom1, kolom2 ) dari tabel di mana "set yang saya inginkan" );
sumber
404
)Jika tabel Anda t1 dan cadangannya t2 memiliki banyak kolom, inilah cara ringkas untuk melakukannya.
Selain itu, masalah saya yang terkait adalah bahwa hanya beberapa kolom yang dimodifikasi dan banyak baris tidak diedit ke kolom ini, jadi saya ingin membiarkannya sendiri - pada dasarnya mengembalikan subset kolom dari cadangan seluruh tabel. Jika Anda hanya ingin mengembalikan semua baris, lewati klausa di mana.
Tentu saja cara yang lebih sederhana adalah menghapus dan menyisipkan sebagai pilih, tetapi dalam kasus saya, saya membutuhkan solusi hanya dengan pembaruan.
Kuncinya adalah ketika Anda memilih * dari sepasang tabel dengan nama kolom duplikat, yang ke-2 akan dinamai _1. Jadi, inilah yang saya pikirkan:
sumber
sumber