यह डुप्लिकेट में से एक को बनाए रखेगा:
delete from join_table
where ctid not in (select min(ctid)
from join_table
group by id1, id2);
आपकी तालिका में एक विशिष्ट पहचानकर्ता नहीं है जिसका उपयोग "एक उत्तरजीवी को चुनने" के लिए किया जा सकता है। यहीं पर पोस्टग्रेस का ctid
. है काम आता है, क्योंकि यह प्रत्येक पंक्ति के लिए एक आंतरिक विशिष्ट पहचानकर्ता है। ध्यान दें कि आपको कभी भी ctid
. का उपयोग नहीं करना चाहिए केवल एक से अधिक कथन के लिए। यह एक सार्वभौमिक रूप से अनूठी चीज नहीं है, लेकिन किसी एक कथन के रनटाइम के लिए यह ठीक है।
SQLFiddle उदाहरण:http://sqlfiddle.com/#!15/dabfc/1
अगर आप सभी से छुटकारा पाना चाहते हैं डुप्लिकेट की गई पंक्तियाँ:
delete from join_table
where (id1, id2) in (select id1, id2
from join_table
group by id1, id2
having count(*) > 1);
बड़ी मेज पर कोई भी समाधान तेज नहीं होगा। यदि आपको बड़ी तालिका से पर्याप्त संख्या में पंक्तियों की आवश्यकता है, तो डुप्लिकेट के बिना एक नई तालिका बनाना, जैसा कि jjanes ने दिखाया है, बहुत तेज़ होगा।