Jak wykonać AKTUALIZACJĘ, dołączając do tabel w SQLite?

92

Próbowałem :

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

I:

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

Oba działają z MySQL, ale powodują one błąd składni w SQLite.

Jak mogę sprawić, by ta aktualizacja / DOŁĄCZ działała z SQLite w wersji 3.5.9?

e-satis
źródło
Na to już odpowiedział stackoverflow.com/questions/3845718/ ...
Gad D Lord

Odpowiedzi:

129

Nie możesz. SQLite nie obsługuje JOIN w instrukcjach UPDATE .

Ale prawdopodobnie możesz to zrobić za pomocą podzapytania:

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

Czy coś takiego; nie jest jasne, jaki jest twój schemat.

Andrew Watt
źródło
20
To, co robi się owłosione, ma miejsce, gdy musisz skopiować kolumnę z jednej tabeli do drugiej, aby odwrócić kierunek skojarzenia. gdzie w MySQL możesz zrobić coś takiego, jak utworzyć kolumnę foos.bar_id, a update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.idnastępnie upuścić kolumnę bars.foo_id ... jak można to zrobić w SQLite? Jeśli ktoś wie, z pewnością mógłbym go użyć.
hoff2
@ hoff2 Właściwie jest to prawdopodobnie najprostszy sposób na zrobienie tego. W moim przypadku nie musiałem nawet GDZIE ISTNIEJE część: stackoverflow.com/a/3845931/847201
ACK_stoverflow Kwietnia
7

Możesz także użyć ZAMIEŃ, a następnie możesz użyć zaznaczenia z połączeniami. Lubię to:

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
źródło