2010-07-27 14 views
7

मैं अपने तालिका में डुप्लिकेट पंक्तियों और अच्छी तरह से मेरी डेटाबेस डिजाइन 3 वर्ग की है कहते हैं: -कैसे पूरी तरह से नष्ट करने के लिए डुप्लीकेट पंक्तियों

Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (1,'Cinthol','cosmetic soap','soap'); 
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (1,'Cinthol','cosmetic soap','soap'); 
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (1,'Cinthol','cosmetic soap','soap'); 
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (1,'Lux','cosmetic soap','soap'); 
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (1,'Crowning Glory','cosmetic soap','soap'); 
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (2,'Cinthol','nice soap','soap'); 
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (3,'Lux','nice soap','soap'); 
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (3,'Lux','nice soap','soap'); 

मैं प्रत्येक पंक्ति का केवल 1 उदाहरण मेरी तालिका में मौजूद होना चाहिए चाहते हैं। इस प्रकार 2nd, 3rd and last row whcih पूरी तरह से समान हैं हटा दिया जाना चाहिए। इसके लिए मैं क्या प्रश्न लिख सकता हूं? क्या यह temp टेबल बनाने के बिना किया जा सकता है? बस एक ही प्रश्न में?

+0

पहले रिकॉर्ड? SQL सर्वर के किस संस्करण के लिए? –

+0

एसक्यूएल सर्वर 2008. – TCM

+0

मुझे लगता है कि तीसरा वर्ग कहने पर आपका तीसरा सामान्य रूप है। यदि यह किसी तालिका में पूर्ण डुप्लिकेट की अनुमति दे रहा है, तो यह परिभाषा के अनुसार 3 एनएफ में नहीं है;) –

उत्तर

18

इस प्रयास करें - यह आपकी मेज से सभी डुप्लिकेट को नष्ट करेगा:

;WITH duplicates AS 
(
    SELECT 
     ProductID, ProductName, Description, Category, 
     ROW_NUMBER() OVER (PARTITION BY ProductID, ProductName 
          ORDER BY ProductID) 'RowNum' 
    FROM dbo.tblProduct 
) 
DELETE FROM duplicates 
WHERE RowNum > 1 
GO 

SELECT * FROM dbo.tblProduct 
GO 

आपका डुप्लिकेट अब चला जाना चाहिए: उत्पादन होता है: प्रविष्टि आदेश के आधार पर

ProductID ProductName DESCRIPTION  Category 
    1   Cinthol   cosmetic soap  soap 
    1   Lux    cosmetic soap  soap 
    1   Crowning Glory cosmetic soap  soap 
    2   Cinthol   nice soap   soap 
    3   Lux    nice soap   soap 
+2

+1: ड्रैट्स - पीटा –

+0

नाइस मार्क_एस, क्या यह एक सीटीई क्वेरी है? यदि हां, तो क्या सीटीई क्वेरी में 'यूनियन' क्लॉज होना जरूरी नहीं है? – TCM

+0

@ नीतेश पंचल: हां, सीटीई एसक्यूएल सर्वर की अंतर्निहित विशेषताओं में से एक है - जैसा कि ओवर() क्लॉज है :-) –

0

सबसे पहले उपयोग अग्रिम में :) धन्यवाद एक SELECT... INTO:

SELECT DISTINCT ProductID, ProductName, Description, Category 
    INTO tblProductClean 
    FROM tblProduct 

ड्रॉप पहली तालिका।

+5

ओपी से: "क्या यह temp टेबल बनाने के बिना किया जा सकता है? बस एक ही प्रश्न में?" – dcp

4
DELETE tblProduct 
FROM tblProduct 
LEFT OUTER JOIN (
    SELECT MIN(ProductId) as ProductId, ProductName, Description, Category 
    FROM tblProduct 
    GROUP BY ProductName, Description, Category 
) as KeepRows ON 
    tblProduct.ProductId= KeepRows.ProductId 
WHERE 
    KeepRows.ProductId IS NULL 

से How can I remove duplicate rows?

अद्यतन चोरी:

यह तभी productId एक प्राथमिक कुंजी है (जो यह नहीं है) काम करेंगे। आप @marc_s 'विधि का उपयोग करने से बेहतर हैं, लेकिन यदि कोई पीके का उपयोग करने वाला कोई व्यक्ति इस पोस्ट में आता है तो मैं इसे छोड़ दूंगा।

+1

@ एबे: 'पंक्ति' तालिका के लिए प्राथमिक कुंजी थी; मैंने सोचा कि यह एक पल के लिए ओरेकल वाक्यविन्यास था जब तक कि मैंने लिंक नहीं देखा। –

+0

मैं मान रहा था कि ProductId उसकी तालिका में एक प्राथमिक कुंजी थी। मैंने इसे किसी भी भ्रम से बचने में मदद के लिए अपने कॉलम नामों के साथ अपडेट किया है। –

+0

नाइस एबे मिस्सेलर। वोट – TCM

1

मुझे इसे कुछ हफ्ते पहले करना था ... आप SQL सर्वर का किस संस्करण का उपयोग कर रहे हैं? SQL सर्वर 2005 में और ऊपर, आप अपने चयन के हिस्से के रूप ROW_NUMBER उपयोग कर सकते हैं, और केवल का चयन करें जहां ROW_NUMBER 1. मैं सटीक सिंटैक्स भूल है, लेकिन यह अच्छी तरह से प्रलेखित है ... की तर्ज पर कुछ:

Select t0.ProductID, 
     t0.ProductName, 
     t0.Description, 
     t0.Category 
Into tblCleanData 
From (
    Select ProductID, 
      ProductName, 
      Description, 
      Category, 
      Row_Number() Over (
       Partition By ProductID, 
          ProductName, 
          Description, 
          Category 
       Order By  ProductID, 
          ProductName, 
          Description, 
          Category 
      ) As RowNumber 
    From MyTable 
) As t0 
Where t0.RowNumber = 1 

http://msdn.microsoft.com/en-us/library/ms186734.aspx देखें, जो आपको सही दिशा में ले जाना चाहिए।

+1

सच है, लेकिन ओपी को एक डेली स्टेटमेंट की आवश्यकता है ... –

+0

@OMG टट्टू - एर, अच्छा बिंदु। – BenAlabaster

+0

+1 बेन हालांकि .. – TCM

संबंधित मुद्दे