सबसे पहले, मुझे लगता है कि परिणाम यह सही नहीं शक? ऐसा लगता है कि मूल तालिका से तीन 'सैम' हैं। लेकिन सवाल के लिए यह महत्वपूर्ण नहीं है।
फिर यहां हम प्रश्न के लिए आते हैं। आपकी तालिका के आधार पर, डुप्लिकेट मान दिखाने का सबसे अच्छा तरीका count(*)
और Group by
खंड का उपयोग करना है।क्वेरी कैसा दिखेगा इस
SELECT OrderNo, shoppername, amountPayed, city, item, count(*) as RepeatTimes FROM dbo.sales GROUP BY OrderNo, shoppername, amountPayed, city, item HAVING COUNT(*) > 1
कारण है कि अपनी मेज विशिष्ट प्रत्येक रिकॉर्ड की पहचान की, से एक साथ सभी स्तंभों जो रिकॉर्ड नकल के रूप में विचार किया जाएगा मतलब है केवल जब प्रत्येक स्तंभ से सभी मान बिल्कुल एक जैसे हैं , आप डुप्लिकेट रिकॉर्ड्स के लिए सभी फ़ील्ड्स दिखाना चाहते हैं, इसलिए group by
किसी भी कॉलम को याद नहीं करेगा, अन्यथा हां क्योंकि आप केवल 'कॉलम 'समूह द्वारा' खंड में भाग ले सकते हैं।
अब मैं आपको With...Row_Number()Over(...)
के लिए कोई उदाहरण देना चाहता हूं, जो पंक्ति अभिव्यक्ति का उपयोग Row_Number फ़ंक्शन के साथ कर रहा है।
मान लीजिए कि आपके पास लगभग एक ही सारणी है लेकिन शिपिंग दिनांक नामक एक अतिरिक्त कॉलम के साथ, और मूल्य भी बदल सकता है बाकी बाकी भी हैं। संदेश यह है:
OrderNo shoppername amountpayed city Item Shipping Date
1 Sam 10 A Iphone 2016-01-01 1 Sam 10 A Iphone 2016-02-02 1 Sam 5 A Ipod 2016-03-03 2 John 20 B Macbook 2016-04-04 3 John 25 B Macbookair 2016-05-05 4 Jack 5 A Ipod 2016-06-06
सूचना उस पंक्ति # 2 डुप्लिकेट एक अगर आप अभी भी एक इकाई के रूप सभी स्तंभों ले नहीं है। लेकिन क्या होगा यदि आप इन मामलों में डुप्लिकेट के रूप में भी उनका इलाज करना चाहते हैं? आप With...Row_Number()Over(...)
का उपयोग करना चाहिए, और क्वेरी इस प्रकार दिखाई देगा:
WITH TABLEEXPRESSION AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier) --if you consider the one with late shipping date as the duplicate FROM dbo.sales) SELECT * FROM TABLEEXPRESSION WHERE Identifier !=1 --or use '>1'
ऊपर क्वेरी परिणाम एक साथ दे देंगे शिपिंग तिथि के साथ, उदाहरण के लिए:
OrderNo shoppername amountpayed city Item Shipping Date Identifier 1 Sam 10 A Iphone 2016-02-02 2
नोट यह एक अलग है 2016-01-01 के साथ, और 2016-02-02 को फ़िल्टर करने का कारण PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier
है, और शिपिंग तिथि कॉलम में से एक नहीं है जिसे डुप्लिकेट रिकॉर्ड की देखभाल करने की आवश्यकता है, जिसका अर्थ है कि एक 2016-02-02 के साथ अभी भी एक आदर्श हो सकता है आपके प्रश्न के परिणाम।
अब यह छोटा सा संक्षेप में प्रस्तुत, count(*)
और Group by
का उपयोग कर खंड एक साथ सबसे अच्छा विकल्प है जब आप केवल परिणाम के रूप में Group by
खंड से सभी स्तंभों को दिखाना चाहते हैं, अन्यथा आप स्तंभों को group by
में भाग नहीं लेते याद करेंगे।
With...Row_Number()Over(...)
के लिए, यह हर परिदृश्य में उपयुक्त है कि आप डुप्लिकेट रिकॉर्ड ढूंढना चाहते हैं, हालांकि, क्वेरी लिखने के लिए थोड़ा जटिल है और पहले की तुलना में इंजीनियर पर थोड़ा सा जटिल है।
यदि आपका उद्देश्य तालिका से डुप्लिकेट रिकॉर्ड हटाना है, तो आपको बाद में WITH...ROW_NUMBER()OVER(...)...DELETE FROM...WHERE
एक का उपयोग करना होगा।
आशा है कि इससे मदद मिलती है!
मैं 50 क्षेत्रों के लिए प्रयास करें। तो क्या कोई रास्ता नहीं है जिसके द्वारा सभी क्षेत्रों के अलग-अलग नाम लिखने के बिना मैं डुप्लिकेट रिकॉर्ड ढूंढ सकता हूं !! – Matthew
तालिका पर राइट क्लिक करें, चुनें: स्क्रिप्ट टेबल >> >> >> नई क्वेरी संपादक विंडो का चयन करें। अब आपको अपनी चयन सूची मिल गई है, इसे अपने समूह द्वारा अनुभाग में कॉपी और पेस्ट करें। – JerryOL