Mam dwie tabele w bazie danych PostgreSQL 9.3: Tabela link_reply
ma klucz obcy o nazwie which_group
skierowanej do tabeli link_group
.
Chcę usunąć wszystkie wiersze, z link_group
których nie link_reply
istnieje żaden powiązany wiersz . Brzmi dość prosto, ale walczyłem z tym.
Czy będzie to coś takiego prostego (nie działa)?
DELETE FROM link_group WHERE link_reply = NULL;
postgresql
join
postgresql-9.3
delete
Hassan Baig
źródło
źródło
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
Odpowiedzi:
Cytując instrukcję:
Odważny nacisk moje. Korzystanie z informacji, które nie są zawarte w innej tabeli, jest nieco trudne, ale istnieją proste rozwiązania. Od arsenału standardowych technik po ...
...
NOT EXISTS
anty-semi-join jest prawdopodobnie najprostszy i najbardziej wydajny dlaDELETE
:Zakładając (ponieważ nie podano definicji tabeli)
link_group_id
jako nazwę kolumny dla klucza podstawowegolink_group
.Technika skomentowana przez @Mihai również działa (stosowana poprawnie):
Ale ponieważ wyrażenie tabeli w
USING
klauzuli jest połączone z tabelą docelową (lg
w tym przykładzie) za pomocą aCROSS JOIN
, potrzebujesz innej instancji tej samej tabeli jako odskocznia (lg1
w tym przykładzie) dlaLEFT JOIN
, która jest mniej elegancka i zazwyczaj wolniejsza.źródło