2009-04-21 12 views
86

me trataron:¿Cómo realizo una ACTUALIZACIÓN al unir tablas en SQLite?

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 trabajos con MySQL, pero los que me dan un error de sintaxis en SQLite.

¿Cómo puedo hacer que esta ACTUALIZACIÓN/UNIÓN funcione con SQLite versión 3.5.9?

+0

Esto ya es contestada por http://stackoverflow.com/questions/3845718/sql-how-to-update-table-values-from-another-table-with-the-same -user-name –

Respuesta

122

No puede. SQLite doesn't support JOINs in UPDATE statements.

embargo, es probable que pueda 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 por el estilo; no está claro exactamente cuál es tu esquema.

+20

Cuando esto se pone pesado es cuando lo que tiene que hacer es copiar una columna de una tabla a otra para invertir la dirección de una asociación. donde en MySQL podría hacer algo como, crear la columna foos.bar_id, luego 'actualizar foos unir barras en bars.foo_id = foos.id establecer foos.bar_id = bars.id', luego soltar la columna bars.foo_id ... ¿Cómo se puede hacer esto en SQLite? Si alguien sabe, podría usarlo. – hoff2

+0

@ hoff2 En realidad, esta es probablemente la forma más sencilla de hacerlo. En mi caso, ni siquiera necesité DONDE EXISTE parte: http://stackoverflow.com/a/3845931/847201 –

6

También puede usar REPLACE luego puede usar la selección con combinaciones. De esta manera:

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 
Cuestiones relacionadas