web-dev-qa-db-ja.com

別のテーブルに一致するものがない場合にSQLiteテーブルから行を削除する

行IDが別のテーブルに存在しないSQLiteテーブルから行を削除する必要があります。 SELECTステートメントは正しい行を返します。

SELECT * FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL;

ただし、deleteステートメントはSQLIteからエラーを生成します。

DELETE FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL;

エラーは次のとおりです:SQLiteエラー1-「左」の近く:構文エラー。使用できる別の構文はありますか?

25

構文図 でわかるように、SQLiteは明らかにdeleteステートメントとの結合をサポートしていません。ただし、サブクエリを使用してそれらを削除できるはずです。

すなわち。

DELETE FROM cache WHERE id IN
(SELECT cache.id FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL);

(未検証)

46
wimvds

サブクエリのルートをたどるので、結合を完全に取り除き、クエリを単純化することもできます。

DELETE FROM cache WHERE id NOT IN (SELECT id from main);
14
Igor Zevaka