Ich habe zwei Tabellen in einer PostgreSQL 9.3-Datenbank: Tabelle link_reply
hat einen Fremdschlüssel mit dem Namen which_group
, der auf Tabelle zeigt link_group
.
Ich möchte alle Zeilen löschen, in link_group
denen keine verwandte Zeile link_reply
vorhanden ist. Klingt einfach genug, aber ich habe damit zu kämpfen.
Wird es so etwas Einfaches sein (funktioniert nicht)?
DELETE FROM link_group WHERE link_reply = NULL;
postgresql
join
postgresql-9.3
delete
Hassan Baig
quelle
quelle
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
Antworten:
Zitat des Handbuchs:
Meine kühne Betonung. Die Verwendung von Informationen, die nicht in einer anderen Tabelle enthalten sind, ist etwas schwierig, aber es gibt einfache Lösungen. Vom Arsenal der Standardtechniken bis zum ...
... ein
NOT EXISTS
Anti-Semi-Join ist wahrscheinlich am einfachsten und effizientesten fürDELETE
:Angenommen (da keine Tabellendefinitionen angegeben sind)
link_group_id
als Spaltenname für den Primärschlüssel vonlink_group
.Die von @Mihai kommentierte Technik funktioniert ebenfalls (richtig angewendet):
Da der Tabellenausdruck in der
USING
Klausel jedoch mit a mit der Zieltabelle (lg
im Beispiel) verknüpft istCROSS JOIN
, benötigen Sie eine andere Instanz derselben Tabelle als Sprungbrett (lg1
im Beispiel) für dieLEFT JOIN
, die weniger elegant und normalerweise langsamer ist.quelle