Как сделать ОБНОВЛЕНИЕ при объединении таблиц в 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?


На этот вопрос уже ответил 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.