निम्नलिखित उदाहरण प्राथमिक कुंजी या विशिष्ट पहचानकर्ता कॉलम को अनदेखा करते हुए 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
)
);