2010-10-12 16 views
5

में एकाधिक डुप्लिकेट पंक्तियां हटाएं मुझे यकीन है कि इससे पहले पूछा गया है, लेकिन मुझे इसे खोजने में मुश्किल हो रही थी।तालिका

मेरे पास एक तालिका में डुप्लिकेट के कई समूह हैं (एक के लिए 3 रिकॉर्ड, 2 के लिए 2, आदि) - एकाधिक पंक्तियां जहां 1 से अधिक मौजूद हैं।

नीचे क्या मैं उन्हें नष्ट करने के साथ आया है, लेकिन मैं फिर भी कई डुप्लिकेट के लिए स्क्रिप्ट चलाने के लिए देखते हैं है:

set rowcount 1 
delete from Table 
where code in (
    select code from Table 
    group by code 
    having (count(code) > 1) 
) 
set rowcount 0 

यह एक हद तक अच्छी तरह से काम करता है। मुझे डुप्लिकेट के प्रत्येक समूह के लिए इसे चलाने की ज़रूरत है, और फिर यह केवल 1 हटा देता है (जो मुझे अभी चाहिए)।

मैं आपकी सहायता/टिप्पणियों की सराहना करता हूं!

+0

आप कौन से डुप्लीकेट रखना चाहते हैं - पहला/न्यूनतम, या नवीनतम/अधिकतम? और SQL सर्वर के किस संस्करण के लिए? –

+0

या तो - अधिकतम आईडी काम करेगी। एसक्यूएल सर्वर 2000 (हाँ, मुझे पता है) – Dan

+2

संभावित डुप्लिकेट [एसक्यूएल - मैं डुप्लिकेट पंक्तियों को कैसे हटा सकता हूं?] (Http://stackoverflow.com/questions/18932/sql-how-can-i-remove-duplicate-rows) –

उत्तर

6

यदि आपके पास तालिका पर एक प्रमुख कॉलम है, तो आप अपनी तालिका में "विशिष्ट" पंक्तियों को विशिष्ट रूप से पहचानने के लिए इसका उपयोग कर सकते हैं।

अद्वितीय पंक्तियों के लिए आईडी की सूची की पहचान करने के लिए बस उप उप क्वेरी का उपयोग करें और फिर इस सेट के बाहर सब कुछ हटा दें। की तर्ज पर कुछ .....

create table #TempTable 
(
    ID int identity(1,1) not null primary key, 
    SomeData varchar(100) not null 
) 

insert into #TempTable(SomeData) values('someData1') 
insert into #TempTable(SomeData) values('someData1') 
insert into #TempTable(SomeData) values('someData2') 
insert into #TempTable(SomeData) values('someData2') 
insert into #TempTable(SomeData) values('someData2') 
insert into #TempTable(SomeData) values('someData3') 
insert into #TempTable(SomeData) values('someData4') 

select * from #TempTable 

--Records to be deleted 
SELECT ID 
FROM #TempTable 
WHERE ID NOT IN 
(
    select MAX(ID) 
    from #TempTable 
    group by SomeData 
) 

--Delete them 
DELETE 
FROM #TempTable 
WHERE ID NOT IN 
(
    select MAX(ID) 
    from #TempTable 
    group by SomeData 
) 

--Final Result Set 
select * from #TempTable 

drop table #TempTable; 

वैकल्पिक रूप से आप उदाहरण के लिए एक CTE इस्तेमाल कर सकते हैं:

WITH UniqueRecords AS 
(
    select MAX(ID) AS ID 
    from #TempTable 
    group by SomeData 
) 
DELETE A 
FROM #TempTable A 
    LEFT outer join UniqueRecords B on 
     A.ID = B.ID 
WHERE B.ID IS NULL 
+0

बस ध्यान दिया कि ओपी एसक्यूएल सर्वर 2000 पर है, लेकिन सीटीई के साथ इसे और अधिक कुशलता से करना संभव है http://stackoverflow.com/questions/18932/sql-how-can-i-remove-duplicate-rows/3822833 # 3822833 –

0
SET ROWCOUNT 1  
DELETE Table  
FROM Table a  
WHERE (SELECT COUNT(*) FROM Table b WHERE b.Code = a.Code) > 1  
WHILE @@rowcount > 0  
    DELETE Table  
    FROM Table a  
    WHERE (SELECT COUNT(*) FROM Table b WHERE b.Code = a.Code) > 1  
SET ROWCOUNT 0 

यह सब डुप्लीकेट पंक्तियों को नष्ट करेगा, लेकिन यदि आप गुण जोड़ सकते हैं उनके अनुसार तुलना करना चाहते हैं।

+2

"तालिका से हटाएं तालिका" ??? क्या आपने यह स्क्रिप्ट चलाया है? –

2

अस्थायी तालिका में अद्वितीय पंक्तियों की प्रतिलिपि बनाने के लिए अक्सर अधिक कुशल होता है,
ड्रॉप स्रोत तालिका, अस्थायी तालिका का नाम बदलें।

मैं, परिभाषा और #TempTable का डेटा, यहाँ SrcTable के रूप में के बजाय कहा जाता पुन: उपयोग के बाद से यह असंभव है previous answer

-- cloning "unique" part 
SELECT * INTO TempTable 
FROM SrcTable --original table 
WHERE id IN 
(SELECT MAX(id) AS ID 
FROM SrcTable 
GROUP BY SomeData); 
GO; 

DROP TABLE SrcTable 
GO; 

sys.sp_rename 'TempTable', 'SrcTable' 
में John Sansom द्वारा एक नियमित रूप से एक के रूप में अस्थायी तालिका नाम बदलने के लिए)

create table SrcTable 
(
    ID int identity(1,1) not null primary key, 
    SomeData varchar(100) not null 
) 

insert into SrcTable(SomeData) values('someData1') 
insert into SrcTable(SomeData) values('someData1') 
insert into SrcTable(SomeData) values('someData2') 
insert into SrcTable(SomeData) values('someData2') 
insert into SrcTable(SomeData) values('someData2') 
insert into SrcTable(SomeData) values('someData3') 
insert into SrcTable(SomeData) values('someData4') 

+0

यदि आप इस रणनीति का उपयोग करते हैं, तो नाम बदलने के बाद आपको कुंजी, बाधाएं, पहचान मान, अनुक्रमणिका और संबंध – pomarc

1

आप वैकल्पिक रूप से बाहर फिल्टर करने के लिए ROW_NUMBER() समारोह का उपयोग कर सकते डुप्लिकेट

;WITH [CTE_DUPLICATES] AS 
(
SELECT RN = ROW_NUMBER() OVER (PARTITION BY SomeData ORDER BY SomeData) 
FROM #TempTable 
) 
DELETE FROM [CTE_DUPLICATES] WHERE RN > 1 
+0

पढ़ना चाहिए। इस प्रश्न के लिए OP SQL Server 2000 पर है। –