2009-04-21 7 views
86

J'ai essayé:Comment faire une mise à jour lors de la jonction de tables sur SQLite?

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

Et:

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

Les deux œuvres avec MySQL, mais ceux qui me donnent une erreur de syntaxe dans SQLite.

Comment faire pour que cette UPDATE/JOIN fonctionne avec SQLite version 3.5.9?

+0

Ceci est déjà répondu par http://stackoverflow.com/questions/3845718/sql-how-to-update-table-values-from-another-table-with-the-same -user-name –

Répondre

122

Vous ne pouvez pas. SQLite doesn't support JOINs in UPDATE statements.

Mais, vous pouvez probablement faire avec un sous-requête à la place:

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

Ou quelque chose comme ça; on ne sait pas exactement quel est votre schéma.

+20

Lorsque cela devient difficile, vous devez copier une colonne d'une table à une autre afin d'inverser la direction d'une association. où dans MySQL vous pourriez faire quelque chose comme, créer la colonne foos.bar_id, puis 'mettre à jour les foos rejoindre les barres sur les bars.foo_id = foos.id mettre foos.bar_id = bars.id', puis supprimer la colonne bars.foo_id ... comment cela pourrait-il être fait dans SQLite? Si quelqu'un sait, je pourrais l'utiliser. – hoff2

+0

@ hoff2 En fait, c'est probablement le moyen le plus simple de le faire. Dans mon cas, je n'ai même pas besoin de WHERE EXISTS partie: http://stackoverflow.com/a/3845931/847201 –

6

Vous pouvez également utiliser REPLACE, vous pouvez ensuite utiliser la sélection avec des jointures. Comme ceci:

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 
Questions connexes