Como faço um UPDATE ao unir tabelas no SQLite?


92

Eu tentei :

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

E:

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

Ambos funcionam com MySQL, mas me dão um erro de sintaxe no SQLite.

Como posso fazer este UPDATE / JOIN funcionar com o SQLite versão 3.5.9?


Isso já foi
Ivelin Nikolaev

Respostas:


128

Você não pode. SQLite não suporta JOINs em instruções UPDATE .

Mas, você provavelmente pode fazer isso com uma subconsulta:

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

Ou algo assim; não está claro exatamente qual é o seu esquema.


20
Isso fica complicado quando o que você precisa fazer é copiar uma coluna de uma tabela para outra, a fim de inverter a direção de uma associação. onde no MySQL você pode fazer algo como, criar a coluna foos.bar_id e, em seguida update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.id, remover a coluna bars.foo_id ... como isso pode ser feito no SQLite? Se alguém souber, com certeza posso usar.
hoff2

@ hoff2 Na verdade, esta é provavelmente a maneira mais simples de fazer isso. No meu caso, nem
precisei da

6

Você também pode usar REPLACE e, em seguida, usar a seleção com junções. Como isso:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.