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

81

Я пробовал:

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?

Теги:
sql-update
join

2 ответа

126
Лучший ответ

Вы не можете. SQLite не поддерживает JOINs в инструкциях 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? Если кто-нибудь знает, я мог бы использовать это.
  • 0
    @ hoff2 На самом деле, это, наверное, самый простой способ сделать это. В моем случае мне даже не нужно было ГДЕ СУЩЕСТВУЕТ часть: stackoverflow.com/a/3845931/847201
6

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню