यदि आपके पास एक ही उत्पाद कॉलम के साथ दो अलग-अलग रिकॉर्ड हैं, तो आप कुछ मानदंडों के साथ अवांछित रिकॉर्ड चुन सकते हैं, उदा।
CREATE TABLE victims AS
SELECT MAX(entryDate) AS date, Product, COUNT(*) AS dups FROM ProductsTable WHERE ...
GROUP BY Product HAVING dups > 1;
फिर आप उत्पाद योग्य और पीड़ितों के बीच एक विलम्ब जॉइन कर सकते हैं।
या आप केवल उत्पाद का चयन कर सकते हैं, और फिर किसी अन्य जॉइन स्थिति के लिए एक डिलीट कर सकते हैं, उदाहरण के लिए एक अवैध ग्राहक आईडी, या EntryDate NULL, या कुछ और। यह काम करता है यदि आप जानते हैं कि उत्पाद की एक और केवल एक वैध प्रति है, और अन्य सभी अमान्य डेटा द्वारा पहचानने योग्य हैं।
मान लीजिए कि इसके बजाय आपके पास पहचानिक रिकॉर्ड हैं (या आपके पास समान और गैर-समान दोनों हैं, या आपके पास कुछ उत्पाद के लिए कई डुप्ली हो सकते हैं और आप नहीं जानते हैं)। आप बिल्कुल वही क्वेरी चलाते हैं। फिर, आप ProductsTable पर एक SELECT क्वेरी चलाते हैं और उत्पाद कोड से मेल खाने वाले सभी उत्पादों को उत्पादित करते हैं, उत्पाद द्वारा समूहित करते हैं, और सभी फ़ील्ड के लिए उपयुक्त समेकित फ़ंक्शन चुनते हैं (यदि समान है, तो कोई भी कुल करना चाहिए। अन्यथा मैं आमतौर पर MAX की कोशिश करता हूं या मिन)।यह प्रत्येक उत्पाद के लिए बिल्कुल एक पंक्ति "सहेज" देगा।
उस बिंदु पर आप डेली जॉइन चलाते हैं और सभी डुप्लिकेट उत्पादों को मार देते हैं। फिर, मुख्य तालिका में सहेजे गए और deduped सबसेट को बस पुनः आयात करें।
बेशक, डेली जॉइन और इंसर्ट चयन के बीच, आपके पास एक अस्थिर स्थिति में डीबी होगा, कम से कम एक डुप्लिकेट वाले सभी उत्पादों को आसानी से गायब कर दिया जाएगा।
एक और तरीका है जो MySQL में काम करना चाहिए:
-- Create an empty table
CREATE TABLE deduped AS SELECT * FROM ProductsTable WHERE false;
CREATE UNIQUE INDEX deduped_ndx ON deduped(Product);
-- DROP duplicate rows, Joe the Butcher's way
INSERT IGNORE INTO deduped SELECT * FROM ProductsTable;
ALTER TABLE ProductsTable RENAME TO ProductsBackup;
ALTER TABLE deduped RENAME TO ProductsTable;
-- TODO: Copy all indexes from ProductsTable on deduped.
नोट: ऊपर जिस तरह से काम नहीं करता है तो आप "अच्छा रिकॉर्ड" और "अवैध डुप्लिकेट" भेद करने के लिए चाहते हैं। यह केवल तभी काम करता है जब आपके पास अनावश्यक डुप्लिकेट रिकॉर्ड हैं, या यदि आपको परवाह नहीं है, तो पंक्ति जो आप रखती है और जिसे आप फेंक देते हैं!
EDIT: आप कहते हैं कि "डुप्लिकेट" में अवैध फ़ील्ड हैं। तो अगर आप उत्पाद के लिए केवल एक पंक्ति है, सब कुछ ठीक
SELECT * FROM ProductsTable ORDER BY Product, FieldWhichShouldNotBeNULL IS NULL;
और अच्छा है, यह चयनित हो जाएगी: उस मामले में आप एक छंटाई चाल के साथ ऊपर संशोधित कर सकते हैं। यदि आपके पास और अधिक है, तो जिसके लिए (फ़ील्डविच शॉल्डनवेनबुल आईएस न्यूल) गलत है (यानी वह क्षेत्र जहां फ़ील्डविचशल्डनवर बीननल वास्तव में शून्य नहीं है) इसे पहले चुना जाएगा, और डाला जाएगा। अन्य सभी उत्पाद की विशिष्टता के खिलाफ, आईजीएनओआर क्लॉज के कारण चुपचाप उछालेंगे। ऐसा करने का वास्तव में एक सुंदर तरीका नहीं है (और जांच करें कि मैंने अपने खंड में झूठ के साथ सच नहीं मिला!), लेकिन इसे काम करना चाहिए।
संपादित
वास्तव में एक नया उत्तर
के अधिक यह समस्या को वर्णन करने
CREATE TABLE ProductTable (Product varchar(10), Description varchar(10));
INSERT INTO ProductTable VALUES ('CBPD10', 'C-Beam Prj');
INSERT INTO ProductTable VALUES ('CBPD11', 'C Proj Mk2');
INSERT INTO ProductTable VALUES ('CBPD12', 'C Proj Mk3');
कोई सूचकांक अभी तक है, और कोई प्राथमिक कुंजी है एक साधारण तालिका है। हम अभी भी प्राथमिक कुंजी होने के लिए उत्पाद घोषित कर सकते हैं।
लेकिन कुछ बुरा होता है। दो नए रिकॉर्ड मिलते हैं, और दोनों के पास पूर्ण विवरण है।
फिर भी, दूसरा एक मान्य उत्पाद है क्योंकि हम अब पहले सीबीपीडी 14 के बारे में कुछ नहीं जानते थे, और इसलिए हम इस रिकॉर्ड को पूरी तरह खोना नहीं चाहते हैं। हम करते हैं हालांकि नकली सीबीपीडी 10 से छुटकारा पाना चाहते हैं।
INSERT INTO ProductTable VALUES ('CBPD10', NULL);
INSERT INTO ProductTable VALUES ('CBPD14', NULL);
एक अशिष्ट ProductTable से हटाएँ कहां विवरण शून्य है सवाल से बाहर है, यह CBPD14 मार डालेंगे जो एक नकली नहीं है।
तो हम इसे ऐसा करते हैं।
SELECT Product, COUNT(*) AS Dups FROM ProductTable GROUP BY Product HAVING Dups > 1;
हम मान लेते हैं कि:: सबसे पहले डुप्लिकेट की सूची प्राप्त "बुरा रिकॉर्ड के प्रत्येक सेट के लिए कम से कम एक अच्छा रिकॉर्ड नहीं है"।
हम इसके विपरीत और इसके लिए पूछताछ करके इस धारणा की जांच करते हैं। यदि सभी को copacetic है, तो हम इस क्वेरी को कुछ भी वापस करने की उम्मीद नहीं करते हैं।
SELECT Dups.Product FROM ProductTable
RIGHT JOIN (SELECT Product, COUNT(*) AS Dups FROM ProductTable GROUP BY Product HAVING Dups > 1) AS Dups
ON (ProductTable.Product = Dups.Product
AND ProductTable.Description IS NOT NULL)
WHERE ProductTable.Description IS NULL;
आगे सत्यापित करने के लिए, मैं दो रिकॉर्ड डालता हूं जो विफलता के इस मोड का प्रतिनिधित्व करते हैं; अब मैं उपरोक्त क्वेरी को नया कोड वापस करने की अपेक्षा करता हूं।
INSERT INTO ProductTable VALUES ("AC5", NULL), ("AC5", NULL);
अब "जाँच" क्वेरी वास्तव में देता है,
AC5
तो, dups की पीढ़ी अच्छा लगता है।
अब मैं सभी डुप्लिकेट रिकॉर्ड्स को हटाने के लिए आगे बढ़ता हूं जो मान्य नहीं हैं। यदि डुप्लिकेट, वैध रिकॉर्ड हैं, तो वे तब तक डुप्लीकेट रहेंगे जब तक कि कुछ शर्त नहीं मिलती, उनमें से एक "अच्छा" रिकॉर्ड और अन्य सभी को "अमान्य" घोषित करना (शायद विवरण से अलग क्षेत्र के साथ प्रक्रिया को दोहराएं)।
लेकिन अरे, एक रगड़ है। वर्तमान में, आप किसी तालिका से हटा नहीं सकते हैं और एक ही तालिका से उपकुंजी (http://dev.mysql.com/doc/refman/5.0/en/delete.html) में चयन कर सकते हैं। तो थोड़ा कामकाज की आवश्यकता है:
CREATE TEMPORARY TABLE Dups AS
SELECT Product, COUNT(*) AS Duplicates
FROM ProductTable GROUP BY Product HAVING Duplicates > 1;
DELETE ProductTable FROM ProductTable JOIN Dups USING (Product)
WHERE Description IS NULL;
अब यह सभी अमान्य रिकॉर्ड हटा देगा, बशर्ते वे डुप्स तालिका में दिखाई दें।
इसलिए हमारे सीबीपीडी 14 रिकॉर्ड को छूटा नहीं जाएगा, क्योंकि यह वहां दिखाई नहीं देता है। सीबीपीडी 10 के लिए "अच्छा" रिकॉर्ड छूटा नहीं जाएगा क्योंकि यह सच नहीं है कि इसका विवरण पूर्ण है। अन्य सभी - Poof।
मुझे राज्य फिर से है कि यह डुप्लिकेट है अगर एक रिकार्ड कोई वैध रिकॉर्ड और अभी तकहै, तो सभी प्रतियों कि रिकॉर्ड के मारे जाने देंगे - कोई जीवित बचे लोगों हो जाएगा।
इससे बचने के लिए पहले किसी अन्य टेम्पलेटरी तालिका में विफलता के इस मोड का प्रतिनिधित्व करने वाली पंक्तियों को ऊपर (ऊपर दिए गए प्रश्न का उपयोग करके, चेक "का उपयोग कर सकते हैं), फिर हटाए जाने के बाद उन्हें मुख्य तालिका में वापस ले जाएं (लेनदेन का उपयोग क्रम में हो सकता है)।
डेटाबेस कितना बड़ा है। क्या हम यहां लाखों पंक्तियों से बात कर रहे हैं? अरबों? –
3000 डुप्लीकेट के साथ लगभग 200,000 रिकॉर्ड, इतना नहीं: डी – Sypress
जब आपके पास उत्पाद के लिए एक ही डेटा के साथ दो रिकॉर्ड हैं, लेकिन अन्य कॉलम में अलग-अलग डेटा, आप कैसे जानते हैं कि रखने के लिए कौन सा सही है? –