У меня есть две таблицы в базе данных PostgreSQL 9.3: Таблица link_reply
имеет внешний ключ, which_group
указывающий на таблицу link_group
.
Я хочу удалить все строки, из link_group
которых не существует связанных строк link_reply
. Звучит достаточно просто, но я боролся с этим.
Будет ли что-то простое, как это (не работает)?
DELETE FROM link_group WHERE link_reply = NULL;
postgresql
join
postgresql-9.3
delete
Хасан Бэйг
источник
источник
DELETE FROM links_group USING links_group AS lg LEFT JOIN links_reply AS lr ON lg.col= lr.some_other_col WHERE links_reply.some_other_col IS NULL
Ответы:
Цитирование руководства:
Жирный акцент мой. Использование информации, которая не содержится в другой таблице, немного сложно, но есть простые решения. От арсенала стандартных приемов до ...
...
NOT EXISTS
анти-полусоединение, вероятно, самое простое и наиболее эффективное дляDELETE
:Предполагая (поскольку определения таблиц не предоставлены) в
link_group_id
качестве имени столбца для первичного ключаlink_group
.Техника @Mihai прокомментировала также хорошо (применяется правильно):
Но поскольку табличное выражение в
USING
предложении объединено с целевой таблицей (lg
в примере) с помощью aCROSS JOIN
, вам необходим другой экземпляр той же таблицы в качестве ступеньки (lg1
в примере) для объектаLEFT JOIN
, который менее элегантен и обычно медленнее.источник