Kılavuzdan alıntı:
Veritabanındaki diğer tablolarda bulunan bilgileri kullanarak bir tablodaki satırları silmenin iki yolu vardır: alt seçimleri kullanma veya USING
yan tümcedeki ek tabloları belirtme . Hangi tekniğin daha uygun olduğu özel koşullara bağlıdır.
Cesur vurgu benim. Olduğu bilgileri kullanarak değil başka bir tabloda yer biraz biraz zor, ama kolay çözüm bulunmaktadır. Standart tekniklerin cephaneliğinden ...
... bir NOT EXISTS
anti-yarı-birleşim muhtemelen en basit ve en verimlidir DELETE
:
DELETE FROM link_group lg
WHERE NOT EXISTS (
SELECT FROM link_reply lr
WHERE lr.which_group = lg.link_group_id
);
Öğesinin link_group_id
birincil anahtarı için sütun adı olarak varsayıldığında (tablo tanımları sağlanmadığından) link_group
.
@Mihai yorumladı tekniği de işe yarıyor (doğru uygulanmış):
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;
Ancak, USING
cümledeki tablo ifadesi hedef tabloya ( lg
örnekte) a ile birleştirildiğinden, daha az zarif ve tipik olarak daha yavaş olan için CROSS JOIN
basamaklı taşla ( lg1
örnekte) aynı tablonun başka bir örneğine ihtiyacınız vardır LEFT JOIN
.