Mengutip manual:
Ada dua cara untuk menghapus baris dalam tabel menggunakan informasi yang terkandung dalam tabel lain dalam database: menggunakan sub-seleksi, atau menentukan tabel tambahan dalam USING
klausa . Teknik mana yang lebih tepat tergantung pada keadaan spesifik.
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 untuk DELETE
:
DELETE FROM link_group lg
WHERE NOT EXISTS (
SELECT FROM link_reply lr
WHERE lr.which_group = lg.link_group_id
);
Dengan asumsi (karena definisi tabel tidak disediakan) link_group_id
sebagai nama kolom untuk kunci utama link_group
.
Teknik @Mihai berkomentar juga bekerja (diterapkan dengan benar):
DELETE FROM link_group lg
USING link_group lg1
LEFT JOIN link_reply lr ON lr.which_group = lg1.link_group_id
WHERE lg1.link_group_id = lg.link_group_id
AND lr.which_group IS NULL;
Tetapi karena ekspresi tabel dalam USING
klausa digabungkan ke tabel target ( lg
dalam contoh) dengan a CROSS JOIN
, Anda perlu contoh lain dari tabel yang sama dengan batu loncatan ( lg1
dalam contoh) untuk LEFT JOIN
, yang kurang elegan dan biasanya lebih lambat.