Wie erstelle ich ein UPDATE, während ich Tabellen auf SQLite verbinde?

92

Ich habe es versucht :

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 funktionieren mit MySQL, aber diese geben mir einen Syntaxfehler in SQLite.

Wie kann ich dafür sorgen, dass UPDATE / JOIN mit SQLite Version 3.5.9 funktioniert?

e-satis
quelle
Dies wird bereits von stackoverflow.com/questions/3845718/…
Ivelin Nikolaev

Antworten:

128

Das kannst du nicht. SQLite unterstützt keine JOINs in UPDATE-Anweisungen .

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

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

Oder etwas ähnliches; Es ist nicht klar, was genau Ihr Schema ist.

Andrew Watt
quelle
20
Dies wird haarig, wenn Sie eine Spalte von einer Tabelle in eine andere kopieren müssen, um die Richtung einer Zuordnung umzukehren. Wo in MySQL könnten Sie so etwas tun, die Spalte foos.bar_id erstellen update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.idund dann die Spalte bar.foo_id löschen ... wie könnte dies in SQLite geschehen? Wenn jemand weiß, könnte ich es sicher benutzen.
hoff2
@ hoff2 Eigentlich ist dies wahrscheinlich der einfachste Weg, dies zu tun. In meinem Fall musste ich nicht einmal den Teil WHERE EXISTS: stackoverflow.com/a/3845931/847201
ACK_stoverflow
6

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

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
Roman Nazarevych
quelle