Удаление строк из таблицы SQLite, если совпадение не существует в другой таблице
Мне нужно удалить строки из таблицы 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 - рядом с "левым": синтаксическая ошибка. Есть ли другой синтаксис, который я мог бы использовать?
Ответы
Ответ 1
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);
(не проверено)
Ответ 2
Поскольку вы идете по маршруту подзапроса, вы можете полностью избавиться от соединения и упростить запрос:
DELETE FROM cache WHERE id NOT IN (SELECT id from main);