Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर 2008 में डुप्लिकेट पंक्तियों को कैसे हटाएं?

सीटीई (सामान्य तालिका अभिव्यक्ति) के साथ सबसे आसान तरीका है। जब मैं आयात करने के लिए कच्चा डेटा प्राप्त करता हूं तो मैं इस विधि का उपयोग करता हूं; इसे साफ करने के लिए सबसे पहले मैं यह आश्वस्त करता हूं कि कोई डुप्लीकेट नहीं हैं --- कि मेरे पास प्रत्येक पंक्ति में किसी प्रकार का अनूठा हैंडल है।

सारांश:

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 पंक्तियाँ बची हैं, जिनमें से कोई भी डुप्लिकेट नहीं है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर 2012 में SQLCLR असेंबली में TimeZoneInfo का उपयोग कैसे करता है?

  2. डेटाबेस से सभी कनेक्शनों को समाप्त करने के लिए स्क्रिप्ट (RESTRICTED_USER ROLLBACK से अधिक)

  3. डेटा को उसी तालिका में कॉपी करें और कॉपी किए गए डेटा के मान को एक कॉलम में निर्दिष्ट मान में बदलें

  4. विफल SSIS कार्य जब WinSCP का उपयोग करके FTP सर्वर पर अपलोड की जाने वाली फ़ाइलों का चयन करने के लिए मुखौटा किसी भी फ़ाइल से मेल नहीं खाता

  5. कॉलम के रूप में ROWS प्राप्त करें (SQL सर्वर डायनेमिक PIVOT क्वेरी)