Tuesday, 15 July 2014

sql - delete duplicate rows but keep preferred row -


मेरे पास एक साधारण डेटाबेस तालिका है

  तालिका डेमो बनाने (आईडी पूर्णांक प्राथमिक कुंजी, एफवी पूर्णांक, sv पाठ, rel_id पूर्णांक, विदेशी कुंजी (rel_id) संदर्भों डेमो (आईडी));  

और मैं fv और sv द्वारा समूहीकृत सभी डुप्लिकेट पंक्तियों को हटाना चाहता हूं। जो पहले से ही महान जवाब के साथ एक है। लेकिन मुझे उस परिदृश्य पर एक मोड़ की आवश्यकता है ऐसे मामलों में जहां rel_id है NULL मैं उस पंक्ति को रखना चाहता हूं किसी भी अन्य मामले में कुछ भी जाता है।

तो निम्न मानों का उपयोग करके

  डेमो में डालें (id, fv, sv, rel_id) मूल्य (1,1, 'somestring ', नाउल), (2,2,' सोममोरस्ट्रिंग ', 1), (3,1,' एस्ट्रस्टिंग ', नल), (4,2,' सोममोरस्ट्रिंग ', 3), (5,1,' सोमथेरिंग ' 3)  

या तो

  आईडी | एफवी | Sv | Rel_id --- + ---- + ------------------ + ------- 1 | 1 | 'सोमवारी' | शून्य 2 | 2 | 'सोममोरस्ट्रिंग' | 1 3 | 1 | 'एस्टस्ट्रिंग' | नल  

या

<पूर्व> आईडी | एफवी | Sv | Rel_id --- + ---- + ------------------ + ------- 1 | 1 | 'सोमवारी' | शून्य 3 | 1 | 'एस्टस्ट्रिंग' | नल 4 | 2 | 'सोममोरस्ट्रिंग' | 3

मान्य परिणाम होंगे जहां

  आईडी | एफवी | Sv | Rel_id --- + ---- + ------------------ + ------- 3 | 1 | 'एस्टस्ट्रिंग' | नल 4 | 2 | 'सोममोरस्ट्रिंग' | 3 5 | 1 | 'सोमवारी' | 3  

नहीं होगा जैसा कि पहली प्रविष्टि में NULL जैसा rel_id था, जो NOT NULL से ऊपर राष्ट्रपति पद लेता है।

मैं वर्तमान में यह है (जो कि मूल डुप्लिकेट प्रश्न पर एक जवाब) डुप्लिकेट को निकालने के लिए एक क्वेरी के रूप में, लेकिन मुझे यकीन नहीं है कि मेरी ज़रूरतों को पूरा करने के लिए क्वेरी को कैसे संशोधित करना जारी रखता है।

  डेमो से डेमो जहां नहीं (चयन  नहीं नल  एंट्री को डेटाबेस से पहले  से पहले दर्ज किया जाता है, जैसे कि आईडी (आईडी) से डेमो ग्रुप द्वारा एफवी, एसवी) आईडी / शून्य  प्रविष्टि  नहीं नल  हटाया नहीं जाएगा यह गारंटी है कि  rel_id  हमेशा एक प्रविष्टि पर ध्यान केंद्रित करेगा जहां  rel_id  है  NULL  इसलिए संदर्भित प्रविष्टि हटाने का कोई खतरा नहीं है इसके साथ ही यह गारंटी दी जाती है कि  rel_id IS NULL  के साथ एक ही समूह में कोई दो पंक्तियां नहीं होगी। 

या मूल एल्गोरिदम के रूप में:

  1. सभी पंक्तियों और समूह पर जाएं उन्हें fv और sv
  2. एक पंक्ति के लिए प्रत्येक समूह में देखें जहां rel_id IS NULL है। यदि उस पंक्ति को रखना है (और बाकी को हटाना) फिर अपनी पसंद की एक पंक्ति चुनें और बाकी को हटा दें।

< पी> मुझे लगता है कि यह काम किया है

  डेमो से डेमो कहाँ नहीं है (SELECT min (id) आईडी से आईडी के रूप में आउट_बफ जहां rel_id नल या नहीं है (चयन आईडी से डेमो ए एस इन_बफ में WHERE rel_id है नल और इन_बफ़.फ़्वी = आउट_बफ़.एफवी और इन_बफ एसवी = आउट_बफ़ एसवी) ग्रुप द्वारा एफवी, एसवी);  सेलेक्ट  या  rel_id  के साथ केवल <पंक्ति> मान  NULL  के साथ चयन करके  

या rel_id IS NULL के साथ एक पंक्ति के अस्तित्व के लिए विरोधी स्थिति का उपयोग करके ग्रुप BY तर्कों से मेल खाने वाली सभी पंक्तियां। लेकिन मेरी क्वेरी वास्तव में अप्रभावी दिखती है एक भोलेपन के रूप में कम से कम O (n ^ 2) पर चलने का समय लगाया जाएगा।


No comments:

Post a Comment