Come faccio a fare un AGGIORNAMENTO mentre unisco le tabelle su SQLite?


92

Provai :

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

E:

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

Entrambi funzionano con MySQL, ma quelli mi danno un errore di sintassi in SQLite.

Come posso fare in modo che questo UPDATE / JOIN funzioni con SQLite versione 3.5.9?


Questo è già stato risposto da stackoverflow.com/questions/3845718/…
Ivelin Nikolaev

Risposte:


128

Non puoi. SQLite non supporta i JOIN nelle istruzioni UPDATE .

Ma probabilmente puoi farlo con una sottoquery:

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

O qualcosa di simile; non è chiaro esattamente quale sia il tuo schema.


20
Dove questo diventa complicato è quando quello che devi fare è copiare una colonna da una tabella a un'altra per invertire la direzione di un'associazione. dove in MySQL potresti fare qualcosa del tipo, creare la colonna foos.bar_id, quindi update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.id, quindi rilasciare la colonna bars.foo_id ... come è possibile farlo in SQLite? Se qualcuno lo sa, potrei sicuramente usarlo.
hoff2

@ hoff2 In realtà, questo è probabilmente il modo più semplice per farlo. Nel mio caso non ho nemmeno bisogno di cui è presente parte: stackoverflow.com/a/3845931/847201
ACK_stoverflow

6

Puoi anche usare REPLACE, quindi puoi usare la selezione con i join. Come questo:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.