¿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?


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.