Diğer tabloda referans verilmeyen DELETE satırları


15

PostgreSQL 9.3 veritabanında iki tablo var: Tablo link_reply, which_grouptablo işaret adlı yabancı bir anahtar var link_group.

link_groupİlişkili bir satırın olmadığı tüm satırları silmek istiyorum link_reply. Kulağa yeterince basit geliyor ama bununla mücadele ediyorum.

Böyle basit bir şey olacak mı (çalışmıyor)?

DELETE FROM link_group WHERE link_reply = NULL;

herkesin bakması için bir DDL'niz var mı?
dizzystar

MINUS operatörüne bir göz atın. Links_reply içinde bir alan belirtmeniz gerekir.
Vérace

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
Mihai

Benzer bir sorum vardı, bu da hesaba katılıyor. Bkz. Dba.stackexchange.com/questions/251875 .
pbillen

Yanıtlar:


19

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 USINGyan 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 EXISTSanti-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_idbirincil 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, USINGcümledeki tablo ifadesi hedef tabloya ( lgörnekte) a ile birleştirildiğinden, daha az zarif ve tipik olarak daha yavaş olan için CROSS JOINbasamaklı taşla ( lg1örnekte) aynı tablonun başka bir örneğine ihtiyacınız vardır LEFT JOIN.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.