Удаление строк из таблицы SQLite, если в другой таблице нет совпадений - PullRequest
23 голосов
/ 11 февраля 2011

Мне нужно удалить строки из таблицы 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 - рядом «слева»: синтаксическая ошибка. Есть ли другой синтаксис, который я мог бы использовать?

Ответы [ 2 ]

45 голосов
/ 11 февраля 2011

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);

(не тестировалось)

13 голосов
/ 10 июня 2012

Поскольку вы идете по маршруту подзапроса, вы можете полностью избавиться от объединения и упростить запрос:

DELETE FROM cache WHERE id NOT IN (SELECT id from main);
...