Две таблицы - как удалить строки, если ID не указан в обеих таблицах - PullRequest
3 голосов
/ 29 апреля 2011

У меня есть две таблицы:

listings(item_id, ...)
images(item_id,  ...)

Значение item_id одинаково в обеих таблицах - но я обманываю и удаляю списки из таблицы «списков», не удаляя также соответствующую строку в таблице «изображений».

Итак - я хочу удалить все строки во второй таблице 'images', если item_id в ИЗОБРАЖЕНИЯХ не соответствует ни одному из более актуальных значений item_id в моей основной таблице 'lists'.

Как удалить все записи в таблице изображений, на которые нет ссылок из списков? 1008 *

Я экспериментировал со сценарием SQL и подзапросом, подобным этому:

DELETE FROM images WHERE item_id IN
(SELECT item_id FROM images EXCEPT SELECT item_id FROM listings)

Но прежде чем я все испорчу, хотите убедиться, что это правильно?

Ответы [ 4 ]

9 голосов
/ 29 апреля 2011

Вы должны использовать подзапрос

DELETE FROM images WHERE item_id NOT IN(SELECT item_id FROM listings)

Больше примеров и объяснений .

7 голосов
/ 29 апреля 2011

Вот хороший прием для решения этих деликатных ситуаций:

Перед запуском запроса, который может причинить значительный вред, если неправильно написано, замените DELETE / UPDATE на SELECT, чтобы увидеть, на какие строки повлияет ваш запрос. В вашем случае это будет:

SELECT * 
-- DELETE
FROM images WHERE item_id NOT IN (SELECT item_id FROM listings) 

Конечно, вы также хотите прикрыть себя резервным копированием базы данных перед выполнением такой команды. Даже если ваш запрос выглядит правильно с помощью теста SELECT, вы никогда не узнаете ...

4 голосов
/ 29 апреля 2011

Это бы сработало, или предложение IN.

DELETE
FROM image
WHERE item_id NOT IN (SELECT item_id FROM listings)
1 голос
/ 29 апреля 2011

Мне было бы яснее сказать

DELETE FROM images WHERE item_id NOT IN 
    (SELECT item_id FROM listings) 
...