Як зробити ОНОВЛЕННЯ під час приєднання таблиць на 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.

Як я можу зробити так, щоб це ОНОВЛЕННЯ / ПРИЄДНАННЯ працювало з SQLite версії 3.5.9?


Відповіді:


128

Ви не можете. 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 Насправді, це, мабуть, найпростіший спосіб це зробити. У моєму випадку я навіть не потрібно ДЕ ІСНУЄ частина: stackoverflow.com/a/3845931/847201
ACK_stoverflow

6

Ви також можете використовувати ЗАМІНИТИ, тоді ви можете використовувати виділення з об'єднаннями. Подобається це:

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.