sqliteで外部テーブルのパラメーターから複数行をまとめて削除する(sqlite/ javascript)

SQL

テーブル同士をjoinした先のカラムを条件にデータを削除する際のやり方です。
sql server っぽい書き方したら通らなかったので覚書きです。

sqliteで通らなかった書き方がこちら。

DELETE table1
FROM table1
LEFT JOIN table2
    ON table1.table2_id = table2.id
WHERE table1.table2_id = 1 -- 適当なID
    AND table2.name == 'hoge' -- 適当なname 

素直にJOINしてWHEREで絞ったレコードを消そうとしたのですが警告されます。
検索する限り、MySQLでも同じようなクエリで通りそうな雰囲気ですが試してないので知りません。

sqliteで処理するにはRowの選択部分をサブクエリに落としてやらなければなりません。
上のクエリをsqlite用に書き直すとこんな感じ。

DELETE FROM table1
WHERE id IN (
    SELECT table1.id
    FROM table1
    LEFT JOIN table2
        ON (table1.table2_id = table2.id)
    WHERE table1.table2_id = 1 -- 適当なID
        AND table2.name == 'hoge' -- 適当なname
)

この例ではidをWHEREの条件にしていますが、RowIdでもいいですね。
特にインデックスはってなかったりする場合はRowIdの方が好ましいです。

コメント