Saya memiliki dua tabel dalam database PostgreSQL 9.3: Tabel link_reply
memiliki kunci asing bernama which_group
menunjuk ke tabel link_group
.
Saya ingin menghapus semua baris dari link_group
tempat tidak ada baris terkait link_reply
. Kedengarannya cukup mendasar tetapi saya sudah berjuang dengan itu.
Apakah ini akan menjadi sesuatu yang sederhana seperti ini (tidak berfungsi)?
DELETE FROM link_group WHERE link_reply = NULL;
postgresql
join
postgresql-9.3
delete
Hassan Baig
sumber
sumber
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
Jawaban:
Mengutip manual:
Penekanan berani saya. Menggunakan informasi yang tidak terkandung dalam tabel lain agak sulit, tetapi ada solusi mudah. Dari gudang teknik standar untuk ...
...
NOT EXISTS
anti-semi-join mungkin paling sederhana dan paling efisien untukDELETE
:Dengan asumsi (karena definisi tabel tidak disediakan)
link_group_id
sebagai nama kolom untuk kunci utamalink_group
.Teknik @Mihai berkomentar juga bekerja (diterapkan dengan benar):
Tetapi karena ekspresi tabel dalam
USING
klausa digabungkan ke tabel target (lg
dalam contoh) dengan aCROSS JOIN
, Anda perlu contoh lain dari tabel yang sama dengan batu loncatan (lg1
dalam contoh) untukLEFT JOIN
, yang kurang elegan dan biasanya lebih lambat.sumber