¿Cómo hago una ACTUALIZACIÓN al unir tablas en SQLite?

92

Lo intenté :

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

Y:

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

Ambos funcionan con MySQL, pero me dan un error de sintaxis en SQLite.

¿Cómo puedo hacer que este UPDATE / JOIN funcione con SQLite versión 3.5.9?

e-satis
fuente
Esto ya está respondido por stackoverflow.com/questions/3845718/…
Ivelin Nikolaev

Respuestas:

128

No puedes. SQLite no admite JOIN en declaraciones UPDATE .

Pero, probablemente puedas hacer esto con una subconsulta en su lugar:

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

O algo así; no está claro exactamente cuál es su esquema.

Andrew Watt
fuente
20
Donde esto se complica es cuando lo que debe hacer es copiar una columna de una tabla a otra para invertir la dirección de una asociación. dónde en MySQL podría hacer algo como, crear la columna foos.bar_id, luego update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.id, luego soltar la columna bars.foo_id ... ¿cómo podría hacerse esto en SQLite? Si alguien lo sabe, seguro que podría usarlo.
hoff2
@ hoff2 En realidad, esta es probablemente la forma más sencilla de hacer esto. En mi caso, ni siquiera necesitaba la parte DONDE EXISTE: stackoverflow.com/a/3845931/847201
ACK_stoverflow
6

También puede usar REPLACE y luego puede usar la selección con uniones. Me gusta esto:

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
fuente