Как сделать ОБНОВЛЕНИЕ при объединении таблиц в SQLite?

92

Я старался :

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?

e-satis
источник
На этот вопрос уже ответил stackoverflow.com/questions/3845718/…
Gad D Lord

Ответы:

129

Вы не можете. SQLite не поддерживает JOIN в операторах UPDATE .

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

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

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

Эндрю Ватт
источник
20
Это становится непросто, когда вам нужно скопировать столбец из одной таблицы в другую, чтобы изменить направление ассоциации. где в MySQL вы могли бы сделать что-то вроде: создать столбец foos.bar_id, а update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.idзатем отбросить столбец bars.foo_id ... как это можно сделать в SQLite? Если кто знает, я бы точно мог им воспользоваться.
hoff2
@ hoff2 На самом деле, это, наверное, самый простой способ сделать это. В моем случае мне даже не потребовалось, чтобы часть WHERE EXISTS: stackoverflow.com/a/3845931/847201
ACK_stoverflow
7

Вы также можете использовать 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
Роман Назаревич
источник