2009-04-21 2 views
86

Ich habe versucht:Wie führe ich ein UPDATE beim Verbinden von Tabellen auf SQLite?

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

Und:

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

Beide Arbeiten mit MySQL, aber diejenigen, geben Sie mir einen Syntaxfehler in SQLite.

Wie kann ich dieses UPDATE/JOIN mit SQLite Version 3.5.9 arbeiten lassen?

+0

Das bereits von http://stackoverflow.com/questions/3845718/sql-how-to-update-table-values-from-another-table-with-the-same beantwortet wird -username –

Antwort

122

Sie können nicht. SQLite doesn't support JOINs in UPDATE statements.

Aber, können Sie wahrscheinlich tun dies mit einer Unterabfrage statt:

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

Oder so ähnlich; Es ist nicht klar, was genau dein Schema ist.

+20

Wenn das Problem auftritt, kopieren Sie eine Spalte von einer Tabelle in eine andere, um die Richtung einer Assoziation umzukehren. wo in MySQL Sie etwas tun könnten, erstellen Sie die foos.bar_id Spalte, dann 'foos Join Bars aktualisieren auf bars.foo_id = foos.id set foos.bar_id = bars.id', dann die bars.foo_id Spalte fallen lassen ... wie könnte das in SQLite gemacht werden? Wenn jemand weiß, könnte ich es sicher verwenden. – hoff2

+0

@ hoff2 Eigentlich ist dies wahrscheinlich der einfachste Weg, dies zu tun. In meinem Fall brauchte ich nicht einmal WO EXISTS Teil: http://stackoverflow.com/a/3845931/847201 –

6

Sie können auch REPLACE verwenden, dann können Sie die Auswahl mit Joins verwenden. So:

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