Bagaimana cara melakukan UPDATE saat bergabung dengan tabel di SQLite?

92

Saya mencoba :

UPDATE closure JOIN item ON ( item_id = id ) 
SET checked = 0 
WHERE ancestor_id = 1

Dan:

UPDATE closure, item 
SET checked = 0 
WHERE ancestor_id = 1 AND item_id = id

Keduanya bekerja dengan MySQL, tetapi itu memberi saya kesalahan sintaks di SQLite.

Bagaimana cara membuat UPDATE / JOIN ini berfungsi dengan SQLite versi 3.5.9?

e-satis
sumber
Ini sudah dijawab oleh stackoverflow.com/questions/3845718/…
Ivelin Nikolaev

Jawaban:

128

Tidak boleh. SQLite tidak mendukung GABUNG dalam pernyataan UPDATE .

Tapi, Anda mungkin bisa melakukan ini dengan subkueri:

UPDATE closure SET checked = 0 
WHERE item_id IN (SELECT id FROM item WHERE ancestor_id = 1);

Atau semacam itu; tidak jelas apa skema Anda.

Andrew Watt
sumber
20
Di mana ini menjadi rumit adalah ketika yang perlu Anda lakukan adalah menyalin kolom dari satu tabel ke tabel lain untuk membalik arah asosiasi. di mana di MySQL Anda dapat melakukan sesuatu seperti, buat kolom foos.bar_id, lalu update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.id, lalu lepaskan kolom bars.foo_id ... bagaimana ini bisa dilakukan di SQLite? Jika ada yang tahu, saya pasti bisa menggunakannya.
hoff2
@ hoff2 Sebenarnya, ini mungkin cara paling sederhana untuk melakukan ini. Dalam kasus saya, saya bahkan tidak perlu ke MANA ADA bagian: stackoverflow.com/a/3845931/847201
ACK_stoverflow
6

Anda juga dapat menggunakan REPLACE lalu Anda dapat menggunakan seleksi dengan gabungan. Seperti ini:

REPLACE INTO clusure 
 SELECT sel.col1,sel.col2,....,sel.checked --checked should correspond to column that you want to change
FROM (
 SELECT *,0 as checked FROM closure LEFT JOIN item ON (item_id = id) 
 WHERE ancestor_id = 1) sel
Roman Nazarevych
sumber