DELETE पंक्तियाँ जिन्हें अन्य तालिका में संदर्भित नहीं किया गया है


15

मेरे पास PostgreSQL 9.3 डेटाबेस में दो टेबल हैं: टेबल link_replyमें टेबल की which_groupओर इशारा करते हुए एक विदेशी कुंजी है link_group

मैं उन सभी पंक्तियों को हटाना चाहता हूँ link_groupजहाँ से कोई संबंधित पंक्ति link_replyमौजूद नहीं है। बुनियादी पर्याप्त लगता है, लेकिन मैं इसके साथ संघर्ष कर रहा हूं।

क्या यह इस तरह से सरल होगा (काम नहीं करना)?

DELETE FROM link_group WHERE link_reply = NULL;

क्या आपके पास सभी को देखने के लिए DDL है?
चक्कर 18

MINUS ऑपरेटर पर एक नज़र डालें। आपको links_reply में एक फ़ील्ड निर्दिष्ट करना होगा।
वेरेस

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
मिहाई

मेरे पास एक समान प्रश्न था, जो खाते में भी संगामिति लेता है। Dba.stackexchange.com/questions/251875 देखें ।
pbillen

जवाबों:


19

मैनुअल का हवाला देते हुए:

डेटाबेस में अन्य तालिकाओं में निहित जानकारी का उपयोग करके तालिका में पंक्तियों को हटाने के दो तरीके हैं: उप-चयन का उपयोग करना, या USINGखंड में अतिरिक्त तालिकाओं को निर्दिष्ट करना । कौन सी तकनीक अधिक उपयुक्त है यह विशिष्ट परिस्थितियों पर निर्भर करता है।

बोल्ड जोर मेरा। ऐसी जानकारी का उपयोग करना जो किसी अन्य तालिका में समाहित नहीं है, एक कठिन बिट है, लेकिन आसान समाधान हैं। मानक तकनीकों के शस्त्रागार से ...

... एक NOT EXISTSएंटी-सेमी-जॉइन शायद सबसे सरल और सबसे कुशल है DELETE:

DELETE FROM link_group lg
WHERE  NOT EXISTS (
   SELECT FROM link_reply lr
   WHERE  lr.which_group = lg.link_group_id
   );

link_group_idप्राथमिक कुंजी के लिए कॉलम नाम के रूप में मान लिया गया है (चूंकि तालिका परिभाषाएं प्रदान नहीं की गई हैं) link_group

तकनीक @ मिहाई ने काम करने के साथ ही (सही ढंग से लागू) भी टिप्पणी की :

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;

लेकिन चूंकि USINGक्लॉज़ में टेबल एक्सप्रेशन को लक्ष्य तालिका ( lgउदाहरण में) के साथ जोड़ दिया जाता है CROSS JOIN, इसलिए, आपको उसी तालिका के एक और उदाहरण की आवश्यकता lg1है LEFT JOIN, जिसके लिए स्टेपिंग स्टोन ( उदाहरण में) है , जो कम सुरुचिपूर्ण है और आमतौर पर धीमी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.