2009-08-03 12 views
41

एमएस एक्सेस में डुप्लिकेट पंक्तियों को खोजने के लिए एसक्यूएल कोड उत्पन्न करने के लिए एक बटन है। मुझे नहीं पता कि SQL सर्वर 2005/2008 प्रबंधन स्टूडियो में यह है या नहीं।डुप्लिकेट खोजने के लिए टी-एसक्यूएल कोड कैसे प्राप्त करें?

  1. यदि यह नहीं है, कृपया इंगित जहां

  2. यदि ऐसा नहीं है, कृपया मुझे बताओ कैसे मैं इस तरह कोड बनाने के लिए एक T-SQL सहायक हो सकता है।

उत्तर

107

ठीक है, अगर आप अपनी तालिका में डुप्लिकेट के रूप में पूरे पंक्तियों है, तो आप कम से कम नहीं एक प्राथमिक कुंजी है कि तालिका के लिए सेट हो जाने पर, नहीं तो कम से कम प्राथमिक कुंजी मूल्य अलग होगा।

हालांकि, यहां कॉलम का समूह से अधिक डुप्लिकेट पाने के लिए एक एसक्यूएल का निर्माण करने का तरीका देखें:

SELECT col1, col2, col3, col4 
FROM table 
GROUP BY col1, col2, col3, col4 
HAVING COUNT(*) > 1 

यह पंक्तियाँ जो, कॉलम col1-col4 के लिए मिल जाएगा, मूल्यों का एक ही संयोजन, एक बार से अधिक है ।

उदाहरण के लिए, निम्न तालिका में, पंक्तियों 2 + 3 होगा डुप्लिकेट:

PK col1 col2 col3 col4 col5 
1  1  2  3  4  6 
2  1  3  4  7  7 
3  1  3  4  7  10 
4  2  3  1  4  5 

दो पंक्तियों कॉलम col1-col4 में समान मूल्यों का हिस्सा, और इस तरह, कि SQL द्वारा, डुप्लिकेट माना जाता है। कॉलम की सूची का विस्तार उन सभी कॉलमों को करने के लिए करें जिनके लिए आप इसका विश्लेषण करना चाहते हैं।

+0

आप एक बिंदु है, क्योंकि कोड के रूप में मुश्किल के रूप में मैं उम्मीद नहीं है । अन्य एसक्यूएल भाषाओं में मैन्युअल रूप से कोड करना मुश्किल हो सकता है –

+3

नहीं होना चाहिए, यह मानक एसक्यूएल है, टी-एसक्यूएल के लिए विशिष्ट नहीं है। यह MySQL, SQLite, Oracle, Sybase, DB2, आदि के लिए समान होना चाहिए –

+0

आप सही हैं। सिंटैक्स हाइलाइटिंग और शोर कोड की कमी ने मुझे विश्वास दिलाया कि एमएस एक्सेस जेनरेट कोड को समझना मुश्किल था और मैंने पहले भी कोशिश नहीं की थी। –

2

AFAIK, ऐसा नहीं है। बस एक तालिका के सभी क्षेत्रों द्वारा समूह चयन करें, और एक क्लॉज का उपयोग करके फ़िल्टरिंग करें जहां गिनती 1 से अधिक है।

यदि आपकी पंक्तियों को कुंजी के अलावा डुप्लीकेट किया गया है, तो कुंजी को शामिल न करें चुनिंदा फ़ील्ड

51

आप एसक्यूएल सर्वर 2005+ का उपयोग कर रहे हैं, तो आप अन्य स्तंभों के साथ-साथ सभी पंक्तियों को देखने के लिए निम्नलिखित कोड का उपयोग कर सकते हैं:

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
FROM table 

योड भी हटा सकते हैं (या अन्य प्रकार के साथ काम) इस का उपयोग करके डुप्लीकेट तकनीक:

WITH cte AS 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
    FROM table 
) 
DELETE FROM cte WHERE DuplicateRowNumber > 1 

ROW_NUMBER अत्यंत शक्तिशाली है - वहाँ ज्यादा है आप इसके साथ क्या कर सकते हैं - http://msdn.microsoft.com/en-us/library/ms186734.aspx

+3

+1 हमें हटाने के तरीके पर शिक्षित करने के लिए +1। इसके अलावा, आपके स्निपेट में पीके भी शामिल है। /नेक्रो – theTuxRacer

+0

इसे शीर्ष 1 – SQueek

+0

के लिए वोट दिया जाना चाहिए एक और लाभ यह है कि यह समूह के मुकाबले तेजी से चल रहा है। –

5

पर उस पर बोल आलेख देखें मैं इस सोल पाया संविधान जब मैं एक या अधिक डुप्लिकेट क्षेत्रों के साथ पूरी पंक्तियों डंप करने की जरूरत है, लेकिन मैं तालिका में हर क्षेत्र का नाम टाइप नहीं करना चाहती:

SELECT * FROM db WHERE col IN 
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1) 
    ORDER BY col 
संबंधित मुद्दे