J'ai deux tables dans une base de données PostgreSQL 9.3: la table link_reply
a une clé étrangère nommée which_group
pointant vers la table link_group
.
Je souhaite supprimer toutes les lignes d' link_group
où aucune ligne associée link_reply
n'existe. Cela semble assez basique mais j'ai eu du mal avec.
Sera-ce quelque chose de simple comme ça (ne fonctionne pas)?
DELETE FROM link_group WHERE link_reply = NULL;
postgresql
join
postgresql-9.3
delete
Hassan Baig
la source
la source
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
Réponses:
Citant le manuel:
Accentuation sur moi. L'utilisation d'informations qui ne sont pas contenues dans une autre table est un peu délicate, mais il existe des solutions faciles. De l'arsenal des techniques standards au ...
... une
NOT EXISTS
anti-semi-jointure est probablement la plus simple et la plus efficace pourDELETE
:En supposant (puisque les définitions de table ne sont pas fournies)
link_group_id
comme nom de colonne pour la clé primaire delink_group
.La technique @Mihai commentée fonctionne également (appliquée correctement):
Mais comme l'expression de table dans la
USING
clause est jointe à la table cible (lg
dans l'exemple) avec unCROSS JOIN
, vous avez besoin d'une autre instance de la même table que le tremplin (lg1
dans l'exemple) pour leLEFT JOIN
, qui est moins élégant et généralement plus lent.la source