2009-04-21 12 views
86

Próbowałem:Jak utworzyć UPDATE przy dołączaniu tabel do SQLite?

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

oraz:

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

Obie prace z MySQL, ale te dają mi błąd składni w SQLite.

Jak mogę uczynić to UPDATE/JOIN działa z SQLite wersja 3.5.9?

+0

to już odpowiedział http://stackoverflow.com/questions/3845718/sql-how-to-update-table-values-from-another-table-with-the-same -user-name –

Odpowiedz

122

Nie możesz. SQLite doesn't support JOINs in UPDATE statements.

Ale prawdopodobnie można to zrobić z podkwerendzie Zamiast:

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

czy coś takiego; nie jest jasne, jaki jest dokładnie twój schemat.

+20

Tam, gdzie robi się włochatym, jest to, co musisz zrobić, to skopiować kolumnę z jednego stołu do drugiego, aby odwrócić kierunek skojarzenia. gdzie w MySQL możesz zrobić coś takiego, utwórz kolumnę foos.bar_id, a następnie "zaktualizuj foos, aby połączyć paski na bars.foo_id = foos.id set foos.bar_id = bars.id', a następnie upuść kolumnę bars.foo_id ... jak to zrobić w SQLite? Jeśli ktokolwiek wie, z pewnością z niego skorzystam. – hoff2

+0

@ hoff2 W rzeczywistości jest to najprostszy sposób na zrobienie tego. W moim przypadku nie potrzebowałem nawet WHERE EXISTS część: http://stackoverflow.com/a/3845931/847201 –

6

Można również użyć REPLACE, a następnie można użyć wyboru z łączeniami. Jak to:

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 
Powiązane problemy