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

प्राथमिक कुंजी को अनदेखा करते हुए SQL सर्वर में डुप्लिकेट पंक्तियों को हटाने के 3 तरीके

निम्नलिखित उदाहरण प्राथमिक कुंजी या विशिष्ट पहचानकर्ता कॉलम को अनदेखा करते हुए SQL सर्वर में डुप्लिकेट पंक्तियों को हटाने के लिए T-SQL का उपयोग करते हैं।

अधिक विशेष रूप से, उदाहरण डुप्लिकेट पंक्तियों को हटाते हैं लेकिन एक रखते हैं। तो, दो समान पंक्तियों को देखते हुए, एक हटा दिया जाता है और दूसरा रहता है। इसे अक्सर "डी-डुपिंग" टेबल, टेबल के "डिडुप्लीकेशन" आदि के रूप में जाना जाता है।

नमूना डेटा

मान लीजिए हमारे पास निम्न डेटा वाली एक तालिका है:

SELECT * FROM Dogs;

परिणाम:

+---------+-------------+------------+
| DogId   | FirstName   | LastName   |
|---------+-------------+------------|
| 1       | Bark        | Smith      |
| 2       | Bark        | Smith      |
| 3       | Woof        | Jones      |
| 4       | Ruff        | Robinson   |
| 5       | Wag         | Johnson    |
| 6       | Wag         | Johnson    |
| 7       | Wag         | Johnson    |
+---------+-------------+------------+

हम देख सकते हैं कि पहली दो पंक्तियाँ डुप्लीकेट हैं, और इसी तरह अंतिम तीन पंक्तियाँ भी हैं।

विकल्प 1

सबसे पहले, यह जांचने के लिए निम्नलिखित कोड चलाते हैं कि कौन सी पंक्तियाँ डी-डुप्लिकेट होने जा रही हैं:

WITH cte AS 
    (
        SELECT 
            *,
            ROW_NUMBER() OVER ( 
                PARTITION BY FirstName, LastName 
                ORDER BY FirstName, LastName
                ) AS Row_Number
        FROM Dogs
    )
SELECT * FROM cte WHERE Row_Number <> 1;

परिणाम:

+---------+-------------+------------+--------------+
| DogId   | FirstName   | LastName   | Row_Number   |
|---------+-------------+------------+--------------|
| 2       | Bark        | Smith      | 2            |
| 6       | Wag         | Johnson    | 2            |
| 7       | Wag         | Johnson    | 3            |
+---------+-------------+------------+--------------+

हमने ROW_NUMBER() . का इस्तेमाल किया PARTITION BY . के साथ कार्य करें क्लॉज हमारी अपनी पंक्ति संख्या बनाने के लिए है जो किसी भी डुप्लिकेट के मिलने पर बढ़ जाती है, और गैर-डुप्लिकेट मिलने पर रीसेट हो जाती है। 1 से बड़ी संख्या इंगित करती है कि यह एक डुप्लीकेट है, और इसलिए हम केवल उन्हीं पंक्तियों को लौटाते हैं जिनकी संख्या 1 से अधिक होती है।

हम देख सकते हैं कि जब हम इस तालिका को डी-डुप्लिकेट करेंगे तो तीन पंक्तियां हटा दी जाएंगी।

आइए अब तालिका को डी-डुप्लिकेट करें:

WITH cte AS 
    (
        SELECT 
            *,
            ROW_NUMBER() OVER ( 
                PARTITION BY FirstName, LastName 
                ORDER BY FirstName, LastName
                ) AS Row_Number
        FROM Dogs
    )
DELETE FROM cte WHERE Row_Number <> 1;

परिणाम:

(3 rows affected)

जैसी अपेक्षित थी, तीन पंक्तियों को हटा दिया गया।

यह क्वेरी लगभग पिछले वाले के समान है। हमने जो कुछ भी किया वह था SELECT * DELETE . की अंतिम पंक्ति पर ।

अब तालिका से सभी पंक्तियों का चयन करें ताकि यह सत्यापित किया जा सके कि सही पंक्तियाँ हटा दी गई हैं:

SELECT * FROM Dogs;

परिणाम:

+---------+-------------+------------+
| DogId   | FirstName   | LastName   |
|---------+-------------+------------|
| 1       | Bark        | Smith      |
| 3       | Woof        | Jones      |
| 4       | Ruff        | Robinson   |
| 5       | Wag         | Johnson    |
+---------+-------------+------------+

हम देख सकते हैं कि प्रत्येक कुत्ता अब तालिका में केवल एक बार दिखाई देता है।

विकल्प 2

यह मानते हुए कि तालिका को पिछले उदाहरण के बाद बहाल कर दिया गया है, यहां डुप्लिकेट की जांच करने का एक और तरीका है:

SELECT * FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

परिणाम:

+---------+-------------+------------+
| DogId   | FirstName   | LastName   |
|---------+-------------+------------|
| 2       | Bark        | Smith      |
| 6       | Wag         | Johnson    |
| 7       | Wag         | Johnson    |
+---------+-------------+------------+

इस मामले में, हमने EXCEPT . का उपयोग किया है ऑपरेटर के साथ MIN() समारोह। हम MIN() . को बदल सकते हैं MAX() . के साथ इस पर निर्भर करता है कि हम किन पंक्तियों को हटाना चाहते हैं।

पंक्तियों को हटाने के लिए, हम बस SELECT * . को बदल सकते हैं DELETE के साथ :

DELETE FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

परिणाम:

(3 rows affected)

और देखें कि क्या बचा है:

SELECT * FROM Dogs;

परिणाम:

+---------+-------------+------------+
| DogId   | FirstName   | LastName   |
|---------+-------------+------------|
| 1       | Bark        | Smith      |
| 3       | Woof        | Jones      |
| 4       | Ruff        | Robinson   |
| 5       | Wag         | Johnson    |
+---------+-------------+------------+

विकल्प 3

इसे करने का दूसरा तरीका यह है कि आप स्वयं तालिका में शामिल हों और इस तरह से डुप्लिकेट की जांच करें।

यह मानते हुए कि पिछले उदाहरण के बाद तालिका को पुनर्स्थापित कर दिया गया है, यहां डुप्लिकेट चुनने के लिए हमारा तीसरा विकल्प है:

SELECT * 
FROM Dogs d1, Dogs d2 
WHERE d1.FirstName = d2.FirstName 
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId 
AND d1.DogId = (
    SELECT MAX(DogId) 
    FROM Dogs d3 
    WHERE d3.FirstName = d1.FirstName 
    AND d3.LastName = d1.LastName
);

परिणाम:

+---------+-------------+------------+---------+-------------+------------+
| DogId   | FirstName   | LastName   | DogId   | FirstName   | LastName   |
|---------+-------------+------------+---------+-------------+------------|
| 2       | Bark        | Smith      | 1       | Bark        | Smith      |
| 7       | Wag         | Johnson    | 5       | Wag         | Johnson    |
| 7       | Wag         | Johnson    | 6       | Wag         | Johnson    |
+---------+-------------+------------+---------+-------------+------------+

यह परिणाम पिछले उदाहरण के समान स्पष्ट नहीं है, लेकिन हम अभी भी देख सकते हैं कि कौन सी पंक्तियाँ डुप्लिकेट हैं।

अब हम उस क्वेरी को संशोधित कर सकते हैं ताकि हम डुप्लिकेट पंक्तियों को हटा दें:

DELETE FROM Dogs WHERE DogId IN (
    SELECT d2.DogId 
    FROM Dogs d1, Dogs d2 
    WHERE d1.FirstName = d2.FirstName 
    AND d1.LastName = d2.LastName 
    AND d1.DogId <> d2.DogId 
    AND d1.DogId=( 
        SELECT MAX(DogId) 
        FROM Dogs d3 
        WHERE d3.FirstName = d1.FirstName 
        AND d3.LastName = d1.LastName
    )
);

परिणाम:

(3 rows affected)

एक बार फिर, तीन पंक्तियों को हटा दिया गया।

आइए तालिका को फिर से देखें:

SELECT * FROM Dogs;

परिणाम:

+---------+-------------+------------+
| DogId   | FirstName   | LastName   |
|---------+-------------+------------|
| 2       | Bark        | Smith      |
| 3       | Woof        | Jones      |
| 4       | Ruff        | Robinson   |
| 7       | Wag         | Johnson    |
+---------+-------------+------------+

आप देख सकते हैं कि इस बार अन्य पंक्तियों को हटा दिया गया था। दूसरे शब्दों में, अब हमारे पास DogId . है s 2, 3, 4, और 7 जबकि पिछले उदाहरणों में हमारे पास 1, 3, 4, और 5 बचे थे।

पिछले उदाहरणों की तरह ही पंक्तियों को हटाने के लिए हम इस उदाहरण को आसानी से बदल सकते हैं। ऐसा करने के लिए, हम MIN() . का उपयोग कर सकते हैं MAX() . के बजाय फ़ंक्शन समारोह:

DELETE FROM Dogs WHERE DogId IN (
    SELECT d2.DogId 
    FROM Dogs d1, Dogs d2 
    WHERE d1.FirstName = d2.FirstName 
    AND d1.LastName = d2.LastName 
    AND d1.DogId <> d2.DogId 
    AND d1.DogId=( 
        SELECT MIN(DogId) 
        FROM Dogs d3 
        WHERE d3.FirstName = d1.FirstName 
        AND d3.LastName = d1.LastName
    )
);

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पता करें कि क्या ऑब्जेक्ट OBJECTPROPERTY () के साथ SQL सर्वर में एक टेबल-वैल्यूड फंक्शन है

  2. SQL सर्वर - पंक्तियों को अल्पविराम से अलग की गई सूची में शामिल करें

  3. SQL IN क्लॉज में टुपल्स का उपयोग करना

  4. SQL सर्वर एक अभिव्यक्ति में मामले को अनदेखा करता है

  5. मुझे SQL सर्वर में अर्धविराम का उपयोग कब करना चाहिए?