UPDATE
. Anda kueri akan terlihat seperti ini:
UPDATE table2 t2
SET val2 = t1.val1
FROM table1 t1
WHERE t2.table2_id = t1.table2_id
AND t2.val2 IS DISTINCT FROM t1.val1; -- optional, see below
Cara Anda memilikinya, tidak ada tautan antara baris individual dari dua tabel. Setiap baris akan diambil dari table1
untuk setiap baris di table2
. Ini tidak masuk akal (dengan cara yang mahal) dan juga memicu kesalahan sintaks, karena ekspresi subquery di tempat ini hanya diperbolehkan untuk mengembalikan satu nilai.
Saya memperbaikinya dengan menggabungkan dua tabel di table2_id
. Ganti itu dengan apa pun yang benar-benar menghubungkan keduanya.
Saya menulis ulang UPDATE
untuk bergabung di table1
(dengan FROM
klausa) daripada menjalankan subkueri yang berkorelasi, karena biasanya lebih cepat dengan urutan besarnya.
Ini juga mencegah table2.val2
akan dibatalkan jika tidak ada baris yang cocok ditemukan di table1
. Sebaliknya, tidak ada terjadi pada baris seperti itu dengan bentuk kueri ini.
Anda dapat menambahkan ekspresi tabel ke FROM
daftar seperti dalam SELECT
plain biasa (tabel, subquery, fungsi set-return, ...). Panduan:
from_list
Daftar ekspresi tabel, yang memungkinkan kolom dari tabel lain muncul di
WHERE
kondisi dan ekspresi pembaruan. Ini mirip dengan daftar tabel yang dapat ditentukan diFROM
KlausulaSELECT
penyataan. Perhatikan bahwa tabel target tidak boleh muncul difrom_list
, kecuali jika Anda bermaksud bergabung sendiri (dalam hal ini harus muncul dengan alias difrom_list
).
WHERE
terakhir klausa mencegah pembaruan yang tidak akan mengubah apa pun - yang praktis selalu merupakan ide bagus (hampir biaya penuh tetapi tidak ada keuntungan, pengecualian eksotis berlaku). Jika nilai lama dan baru dijamin NOT NULL
, sederhanakan menjadi:
AND t2.val2 <> t1.val1
- Bagaimana cara (atau dapatkah saya) PILIH BERBEDA pada beberapa kolom?