SQLiteでテーブルを結合している間にUPDATEを行うにはどうすればよいですか?


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で動作させるにはどうすればよいですか?


回答:


128

できません。SQLite はUPDATEステートメントのJOINをサポートしていません

しかし、おそらく代わりにサブクエリを使用してこれを行うことができます:

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

またはそのようなもの; スキーマが何であるかは明確ではありません。


20
これが厄介なのは、関連付けの方向を逆にするために、あるテーブルから別のテーブルに列をコピーする必要がある場合です。MySQLでは、foos.bar_idカラムを作成してから、bars.foo_idカラムupdate foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.idを削除します。SQLiteでこれを行うにはどうすればよいでしょうか。誰かが知っていれば、私はそれを使用することができます。
hoff2 '14年

@ hoff2実際、これはおそらくこれを行う最も簡単な方法です。私の場合、WHERE EXISTS部分も必要ありませんでした:stackoverflow.com/a/3845931/847201
ACK_stoverflow

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.