Как сделать UPDATE при соединении таблиц в SQLite?

Я пробовал:

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

и

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

Оба работают с MySQL, но это дает мне синтаксическую ошибку в SQLite.

Как я могу заставить этот UPDATE/JOIN работать с SQLite версии 3.5.9?

Ответ 1

Вы не можете. SQLite не поддерживает JOINs в инструкциях UPDATE.

Но вы можете, вероятно, сделать это с помощью подзапроса:

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

Или что-то в этом роде; это не ясно, какова ваша схема.

Ответ 2

Вы также можете использовать REPLACE, затем вы можете использовать выделение с помощью объединений. Вот так:

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