सीटीई (सामान्य तालिका अभिव्यक्ति) के साथ सबसे आसान तरीका है। जब मैं आयात करने के लिए कच्चा डेटा प्राप्त करता हूं तो मैं इस विधि का उपयोग करता हूं; इसे साफ करने के लिए सबसे पहले मैं यह आश्वस्त करता हूं कि कोई डुप्लीकेट नहीं हैं --- कि मेरे पास प्रत्येक पंक्ति में किसी प्रकार का अनूठा हैंडल है।
सारांश:
WITH numbered AS (
SELECT ROW_NUMBER() OVER(PARTITION BY [dupe-column-list] ORDER BY [dupe-column-list]) AS _dupe_num FROM [table-name] WHERE 1=1
)
DELETE FROM numbered WHERE _dupe_num > 1;
"डुप्ली-कॉलम-लिस्ट" भाग वह जगह है जहां आप शामिल सभी कॉलम सूचीबद्ध करते हैं जहां आप चाहते हैं कि मूल्य अद्वितीय थे। ORDER BY वह जगह है जहां आप डुप्लिकेट के एक सेट के भीतर तय करते हैं कि कौन सी पंक्ति "जीतती है" और कौन सी हटा दी जाती है। ("WHERE 1=1" केवल एक व्यक्तिगत आदत है।)
इसके काम करने का कारण यह है कि एसक्यूएल सर्वर सीटीई में चयनित प्रत्येक स्रोत पंक्ति के लिए एक आंतरिक, अद्वितीय संदर्भ रखता है। इसलिए जब DELETE को निष्पादित किया जाता है, तो यह जानता है कि सटीक पंक्ति को हटाया जाना है, भले ही आपने अपने सीटीई की चयन-सूची में जो कुछ भी डाला हो। (यदि आप घबराए हुए हैं, तो आप "हटाएं" को "चयन *" में बदल सकते हैं, लेकिन चूंकि आपके पास डुप्लिकेट पंक्तियां हैं, यह मदद नहीं करेगा; यदि आप प्रत्येक पंक्ति को विशिष्ट रूप से पहचान सकते हैं, तो आप इसे नहीं पढ़ रहे होंगे ।)
उदाहरण:
CREATE TABLE ##_dupes (col1 int, col2 int, col3 varchar(50));
INSERT INTO ##_dupes
VALUES (1, 1, 'one,one')
, (2, 2, 'two,two')
, (3, 3, 'three,three')
, (1, 1, 'one,one')
, (1, 2, 'one,two')
, (3, 3, 'three,three')
, (1, 1, 'one,one')
, (1, 2, '1,2');
8 पंक्तियों में से, आपके पास 5 डुप्लिकेट समस्याएँ हैं; 3 पंक्तियों को हटाने की जरूरत है। आप इसके साथ समस्याएं देख सकते हैं:
SELECT col1
, col2
, col3
, COUNT(1) AS _total
FROM ##_dupes
WHERE 1=1
GROUP BY col1, col2, col3
HAVING COUNT(1) > 1
ORDER BY _total DESC;
अब डुप्लिकेट के प्रत्येक सेट से 1 पंक्ति छोड़कर, डुप्लिकेट को निकालने के लिए निम्न क्वेरी चलाएँ।
WITH numbered AS (
SELECT ROW_NUMBER() OVER(PARTITION BY col1, col2, col3 ORDER BY col1, col2, col3) AS _dupe_num FROM ##_dupes WHERE 1=1
)
DELETE FROM numbered WHERE _dupe_num > 1;
अब आपके पास 5 पंक्तियाँ बची हैं, जिनमें से कोई भी डुप्लिकेट नहीं है।