Подтвердить что ты не робот

Как удалить строки с помощью внешнего соединения

У меня проблема с удалением записей из таблицы PostgreSQL с помощью LEFT JOIN.

Я хочу удалить строки, которые я получаю со следующим запросом:

SELECT * FROM url 
LEFT JOIN link_type ON url.link_type = link_type.id 
WHERE link_type.id IS NULL

Чтобы сделать это, вот что я сделал:

 DELETE FROM url
 USING link_type
 WHERE url.link_type = link_type.id  AND link_type.id IS NULL

Query работает, но ничего не удаляет, хотя именно это объясняется в документе: http://www.postgresql.org/docs/current/static/sql-delete.html.

Является ли моя проблема из-за IS NULL в запросе или я что-то не хватает?

4b9b3361

Ответ 1

По-прежнему не понимаю, почему мой предыдущий запрос не работает (если кто-то может объяснить, было бы хорошо), но вот как я сделал трюк:

DELETE FROM url WHERE NOT EXISTS (SELECT * FROM link_type WHERE url.link_type = link_type.id );

Ответ 2

Хорошая работа, солнце. Незначительное предложение: при использовании EXISTS/NOT EXISTS вам не нужно SELECT *. Общее соглашение (docs) состоит в том, чтобы просто написать SELECT 1 следующим образом:

DELETE FROM url WHERE NOT EXISTS (
  SELECT 1 FROM link_type WHERE url.link_type = link_type.id 
);

Функционально, оба способа работают.