2013-01-31 13 views
5

संभव डुप्लिकेट डुप्लिकेट रिकॉर्ड हटाने के लिए:
How to delete duplicate rows with SQL?कैसे एसक्यूएल में

मैं रिकॉर्ड के साथ एक मेज है और मैं सभी डुप्लिकेट रिकॉर्ड को नष्ट करना चाहते

DELETE FROM 'table' 
WHERE 'field' IN 
(
SELECT 'field' FROM 'table' GROUP BY 'field' 
HAVING (COUNT('field')>1) 
) 

क्यों क्या यह काम नहीं कर रहा है?

+0

क्या आपको कोई त्रुटि संदेश मिला या क्वेरी सफलतापूर्वक चल रही थी? –

+1

आपकी क्वेरी डुप्लीकेट सहित सभी फ़ील्ड को हटा नहीं देगी? यदि आपके पास उस आईडी के साथ 2 डुप्लीकेट हैं तो आपकी IN() क्वेरी दोनों को हटा देगी। क्या आप कम से कम एक रिकॉर्ड रखना नहीं चाहते हैं? – GGio

+2

mysql आपको उस तालिका पर अपडेट/डिलीट नहीं करने देता है जिससे आप डेटा चुन रहे हैं। –

उत्तर

5

हो सकता है कि आप फ़ील्ड में आधारित केवल अद्वितीय रिकॉर्ड चुनने के लिए DISTINCT कमांड के साथ एक्सप्लोर कर सकें।

आप अद्वितीय प्रविष्टियों के आधार पर एक नई तालिका बना सकते हैं। उदाहरण के रूप में ...

CREATE TABLE nonDuplicates 
SELECT DISTINCT * FROM yourTable group by field 
+1

यह केवल काम करेगा क्योंकि MySQL का ग्रुप BY का प्रबंधन मूल रूप से गलत है और इस अमान्य वाक्यविन्यास के लिए अनुमति देता है। लेकिन यह शायद सबसे तेज़ समाधान है। –

+0

धन्यवाद Peixe यह ठीक काम किया! – vdhmartijn

+1

@vdhmartijn: कृपया यह http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html को समझने के लिए पढ़ें * क्यों * यह MySQL में काम कर रहा है और क्यों अन्य डीबीएमएस कथन को अस्वीकार कर देंगे अवैध। –

1

यह आप एक से अधिक परिणाम देता है: - द्वारा इस chenge को

SELECT field FROM `table` 
GROUP BY field 
HAVING (COUNT('field)>1 

प्रयास करें:

SELECT TOP 1 field 
FROM `table` 
GROUP BY field 
HAVING (COUNT(field)>1 
+0

SELECT TOP 1 मेरे लिए काम नहीं करता है .. अभी भी काम नहीं कर रहा है – vdhmartijn

+0

यह कुछ कैसे हटाता है? –

0

पहले सभी डुप्लिकेट और उन्हें सरणी में संग्रहीत करते हैं।

SELECT field 
FROM `table` 
GROUP BY field 
HAVING COUNT('field') > 1 

अब एक परिणाम जो भी आप चाहते हैं बचाने के लिए और उसके बाद निष्पादित

DELETE 
FROM `table` 
WHERE field IN (your values) AND field != savedID 
+0

आपके लिए प्रतिक्रिया के लिए धन्यवाद, लेकिन मेरा इरादा PHP के बिना काम करना है केवल SQL – vdhmartijn

0

MySQL एक बहुत ही अप्रिय प्रतिबंध/एक उप में डाला कि मेज है कि अद्यतन/नष्ट कर दिया जा रहा है उपयोग नहीं कर सकते है आपके php करना -चुनते हैं।

लेकिन आप हटाए जाने के लिए तालिका में शामिल होकर (उप-चयन का उपयोग करने के बजाय) इस पर काम कर सकते हैं।

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
    SELECT min(id) as min_id, field 
    FROM table_with_duplicates 
    GROUP BY field 
) keep ON keep.field = d.field 
     AND keep.min_id <> d.id; 

यह डुप्लिकेट में से प्रत्येक के लिए एक पंक्ति रखेंगे (लॉव्ज़ के साथ एक:

मान लिया जाये कि आप अपनी तालिका में अद्वितीय पहचानकर्ता के कुछ प्रकार है (मैं निम्नलिखित बयान में एक स्तंभ id मान) id कॉलम में मान)।

यदि आप सभी डुप्लिकेट पंक्तियां (कम से कम एक नहीं रखते) को हटाना चाहते हैं, तो बस AND keep.min_id <> d.id स्थिति को हटा दें।

संपादित

आप एक अद्वितीय स्तंभ नहीं है, तो है, लेकिन सभी डुप्लिकेट (कम से कम एक पंक्ति में रखते हुए नहीं) को निकालना चाहते हैं, तो आप उपयोग कर सकते हैं:

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
    SELECT field 
    FROM table_with_duplicates 
    GROUP BY field 
    HAVING count(*) > 1 
) del ON del.field = d.field; 
+0

और यदि मेरे पास कोई आईडी नहीं है तो अभी भी इसे हल करने का कोई तरीका है? – vdhmartijn

+0

@vdhmartijn: यदि आप ** सभी ** डुप्लीकेट (कम से कम एक नहीं रखते) को हटाना चाहते हैं, तो आप आईडी के बिना कर सकते हैं। अन्यथा peixe का जवाब देखें। –

+0

मदद करने के लिए धन्यवाद अब यह काम कर रहा है! – vdhmartijn