SQL सर्वर में डुप्लिकेट पंक्तियों को कैसे हटाएं?


415

मैं डुप्लिकेट पंक्तियों को कैसे हटा सकता हूं जहां कोई unique row idमौजूद नहीं है?

मेरी टेबल है

col1  col2 col3 col4 col5 col6 col7
john  1    1    1    1    1    1 
john  1    1    1    1    1    1
sally 2    2    2    2    2    2
sally 2    2    2    2    2    2

मैं डुप्लिकेट को हटाने के बाद निम्नलिखित के साथ रहना चाहता हूं:

john  1    1    1    1    1    1
sally 2    2    2    2    2    2

मैंने कुछ प्रश्नों की कोशिश की है, लेकिन मुझे लगता है कि वे एक पंक्ति आईडी होने पर निर्भर करते हैं क्योंकि मुझे वांछित परिणाम नहीं मिलता है। उदाहरण के लिए:

DELETE
FROM table
WHERE col1 IN (
    SELECT id
    FROM table
    GROUP BY id
    HAVING (COUNT(col1) > 1)
)

5
यह पहली कड़ी का धोखा नहीं है। इस प्रश्न में कोई पंक्ति ID नहीं है और लिंक किए गए प्रश्न में एक पंक्ति ID है। बहुत अलग।
एलियन टेक्नोलॉजी

'फंक्शन आईडी फ्रॉम टेबल ग्रुप बाय आईडी HAVING' में एग्रेटेड फंक्शन जैसे MAX / MIN को बदलें और इसे काम करना चाहिए।
गड़बड़

जवाबों:


785

मुझे सीटीई पसंद है और ROW_NUMBERजैसा कि दो संयुक्त हमें यह देखने की अनुमति देते हैं कि कौन सी पंक्तियों को हटा दिया गया है (या अपडेट किया गया है), इसलिए बस इसे बदल DELETE FROM CTE...दें SELECT * FROM CTE:

WITH CTE AS(
   SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7],
       RN = ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1)
   FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1

DEMO (परिणाम अलग है; मुझे लगता है कि यह आपकी ओर से एक टाइपो के कारण है)

COL1    COL2    COL3    COL4    COL5    COL6    COL7
john    1        1       1       1       1       1
sally   2        2       2       2       2       2

यह उदाहरण एकल कॉलम के col1कारण डुप्लिकेट को निर्धारित करता है PARTITION BY col1। यदि आप कई स्तंभों को शामिल करना चाहते हैं तो उन्हें बस इसमें जोड़ें PARTITION BY:

ROW_NUMBER()OVER(PARTITION BY Col1, Col2, ... ORDER BY OrderColumn)

2
शानदार जवाब के लिए धन्यवाद। इसके विपरीत MSFT का यहाँ बहुत ही जटिल उत्तर है: stackoverflow.com/questions/18390574/…
बरका

2
@ omachu23: इस मामले में यह कोई फर्क नहीं पड़ता, हालांकि मुझे लगता है कि यह बाहर ( AND COl1='John') की तुलना में सीटीई में अधिक कुशल है । आम तौर पर आपको सीटीई में फ़िल्टर लागू करना चाहिए।
टिम श्मेल्टर

1
@ omachu23: आप CTE (अलग आदेश से) में किसी भी एसक्यूएल उपयोग कर सकते हैं, इसलिए यदि आप जॉन्स द्वारा फिल्टर करना चाहते हैं: ...FROM dbo.Table1 WHERE Col1='John'। यहाँ है फिडेल
टिम श्मेल्टर

1
सबसे आसान समाधान यहाँset rowcount 1 delete from t1 where col1=1 and col2=1 देखा जा सकता है
जोग्राथ

15
यह उत्तर केवल उन पंक्तियों को हटा देगा, जिनकी डुप्लिकेट col1 में है। "चयन" से "विभाजन" में कॉलम जोड़ें, उदाहरण के लिए उत्तर में चयन का उपयोग करके: RN = ROW_NUMBER () OVER (PARTITION BY col1, col2, col3, col4, col4, col5, col6, col7 ORDER BY col1)
1626 पर रोली

158

मैं SQL सर्वर तालिका से डुप्लिकेट पंक्तियों को हटाने के लिए CTE को प्राथमिकता दूंगा

इस लेख का अनुसरण करने की जोरदार सलाह देते हैं :: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/

मूल रखकर

WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY col1,col2,col3 ORDER BY col1,col2,col3) AS RN
FROM MyTable
)

DELETE FROM CTE WHERE RN<>1

मूल रखे बिना

WITH CTE AS
(SELECT *,R=RANK() OVER (ORDER BY col1,col2,col3)
FROM MyTable)
 
DELETE CTE
WHERE R IN (SELECT R FROM CTE GROUP BY R HAVING COUNT(*)>1)

2
घुमावदार कार्य एक महान समाधान है।
रॉबर्ट केसी 16

2
मैं थोड़ा उलझन में हूं। आपने इसे CTE से हटा दिया है मूल तालिका नहीं। तो यह कैसे काम करता है?
बिगईज़

8
@ सीटीई से रिकॉर्ड हटाने से वास्तविक भौतिक तालिका से संबंधित रिकॉर्ड हटा दिए जाएंगे। (क्योंकि सीटीई में वास्तविक रिकॉर्ड का संदर्भ है)।
शमसेर के

मुझे पता नहीं था कि इस पोस्ट तक यह मामला था ... धन्यवाद
Zakk Diaz

1
आप मूल और इसके डुप्लिकेट दोनों को क्यों हटाना चाहते हैं? मुझे समझ नहीं आ रहा है कि आप केवल डुप्लिकेट को हटाकर दूसरे को क्यों नहीं रखना चाहेंगे।
रिच

52

उपयोग किए बिना CTEऔर ROW_NUMBER()आप केवल MAXफ़ंक्शन के साथ समूह का उपयोग करके रिकॉर्ड को हटा सकते हैं यहां और उदाहरण है

DELETE
FROM MyDuplicateTable
WHERE ID NOT IN
(
SELECT MAX(ID)
FROM MyDuplicateTable
GROUP BY DuplicateColumn1, DuplicateColumn2, DuplicateColumn3)

4
यह क्वेरी गैर-डुप्लिकेट रिकॉर्ड को हटा देगी।
डेरेक स्मोल्स

8
यह ठीक काम करता है, धन्यवाद। @DerekSmalls ने मेरे गैर-डुप्लिकेट रिकॉर्ड को नहीं हटाया।
13-30 बजे monteirobrena

1
या आप का उपयोग कर मूल रिकॉर्ड रख सकते हैंMIN(ID)
सैवेज

18
DELETE from search
where id not in (
   select min(id) from search
   group by url
   having count(*)=1

   union

   SELECT min(id) FROM search
   group by url
   having count(*) > 1
)

क्या आप फिर से नहीं लिख सकते हैं: जहां आईडी में (अधिकतम का चयन करें) (आईडी) ... गिनती (*)> 1)?
ब्रेंट

1
मुझे विश्वास नहीं है कि होने या मिलन का उपयोग करने की कोई आवश्यकता है, यह पर्याप्त होगा: खोज से हटाएं जहां id नहीं है (url द्वारा खोज समूह से min (id) चुनें)
क्रिस्टोफर यांग

9

कृपया डिलीट करने का नीचे का तरीका भी देखें।

Declare @table table
(col1 varchar(10),col2 int,col3 int, col4 int, col5 int, col6 int, col7 int)
Insert into @table values 
('john',1,1,1,1,1,1),
('john',1,1,1,1,1,1),
('sally',2,2,2,2,2,2),
('sally',2,2,2,2,2,2)

नामक एक नमूना तालिका बनाई @tableऔर इसे दिए गए डेटा के साथ लोड किया।

यहां छवि विवरण दर्ज करें

Delete  aliasName from (
Select  *,
        ROW_NUMBER() over (Partition by col1,col2,col3,col4,col5,col6,col7 order by col1) as rowNumber
From    @table) aliasName 
Where   rowNumber > 1

Select * from @table

यहां छवि विवरण दर्ज करें

नोट: यदि आप Partition byभाग में सभी कॉलम दे रहे हैं , तो order byअधिक महत्व नहीं है।

मुझे पता है, यह सवाल तीन साल पहले पूछा गया है, और मेरा जवाब टिम ने जो पोस्ट किया है, उसका एक और संस्करण है, लेकिन सिर्फ इसे पोस्ट करना किसी के लिए भी उपयोगी है।


9

यदि आपके पास कोई संदर्भ नहीं है, तो विदेशी कुंजियों की तरह, आप ऐसा कर सकते हैं। मैं बहुत कुछ करता हूं जब अवधारणा के परीक्षण के परीक्षण और परीक्षण डेटा को दोहराया जाता है।

SELECT DISTINCT [col1],[col2],[col3],[col4],[col5],[col6],[col7]

INTO [newTable]

ऑब्जेक्ट एक्सप्लोरर में जाएं और पुरानी तालिका को हटा दें।

पुरानी तालिका के नाम के साथ नई तालिका का नाम बदलें।


यह सबसे सरल तरीका है जो मैंने अपने परिचय सामग्री में सीखा है, और जिसका मैं उपयोग करता हूं।
एरिक

7

Microsoft के पास डुप्लीकेट हटाने के तरीके पर एक vey ry नीट गाइड है। की जाँच करें http://support.microsoft.com/kb/139444

संक्षेप में, यहाँ डुप्लिकेट को हटाने का सबसे आसान तरीका है जब आपके पास हटाने के लिए बस कुछ पंक्तियाँ हों:

SET rowcount 1;
DELETE FROM t1 WHERE myprimarykey=1;

myprimarykey पंक्ति के लिए पहचानकर्ता है।

मैंने 1 से रोअकाउंट सेट किया क्योंकि मेरे पास केवल दो पंक्तियाँ थीं जिन्हें डुप्लिकेट किया गया था। अगर मैं 3 पंक्तियों तो दोहराया गया था मैं सेट होता rowcount इतना है कि यह पहले दो को हटा देता है कि यह देखता है 2 के लिए और केवल तालिका t1 में एक छोड़ देता है।

आशा है कि यह किसी की मदद करता है


1
अगर मुझे 10k पंक्तियाँ हैं तो मुझे कैसे पता चलेगा कि मैंने कितनी पंक्तियों को दोहराया है?
भयघल

@Fearghal "प्राथमिक के द्वारा myTable समूह से प्राथमिक का चयन करें, गिनती (*) का प्रयास करें;"
ओबर्का

1
लेकिन क्या होगा अगर डुप्लिकेट पंक्तियों की संख्या अलग-अलग हो? यानी पंक्ति में 2 रिकॉर्ड हैं और पंक्ति b में 5 रिकॉर्ड हैं और पंक्ति c का कोई डुप्लिकेट रिकॉर्ड नहीं है
थर्माइट

1
@ user2070775 क्या होगा यदि केवल सभी पंक्तियों के एक उपसमूह में डुप्लिकेट हैं, और उन डुप्लिकेट में से कुछ को दो बार और कुछ को तीन या चार बार दोहराया जाता है?
थर्माइट

@ user2070775 मैंने उस हिस्से को याद किया जहां आपने कहा था "हटाने के लिए बस कुछ पंक्तियाँ"। इसके अलावा सेट रॉक्राउन के बारे में पेज पर एक चेतावनी है कि sql के भविष्य के संस्करणों में यह अपडेट को प्रभावित नहीं करेगा और न ही बयानों को
हटाएगा

6

उपयोग करने का प्रयास करें:

SELECT linkorder
    ,Row_Number() OVER (
        PARTITION BY linkorder ORDER BY linkorder DESC
        ) AS RowNum
FROM u_links

यहां छवि विवरण दर्ज करें


4

ऊपर दिए गए समाधान की कोशिश करने के बाद, यह छोटे मध्यम तालिकाओं के लिए काम करता है। मैं उस समाधान को बहुत बड़ी तालिकाओं के लिए सुझा सकता हूं। चूंकि यह पुनरावृत्तियों में चलता है।

  1. के सभी निर्भरता विचारों को छोड़ दें LargeSourceTable
  2. आप sql प्रबंध स्टूडियो का उपयोग करके आश्रितों को पा सकते हैं, तालिका पर राइट क्लिक करें और "दृश्य निर्भरता" पर क्लिक करें
  3. तालिका का नाम बदलें:
  4. sp_rename 'LargeSourceTable', 'LargeSourceTable_Temp'; GO
  5. LargeSourceTableफिर से बनाएं , लेकिन अब, डुप्लिकेट्स जोड़ने वाले सभी स्तंभों के साथ एक प्राथमिक कुंजी जोड़ेंWITH (IGNORE_DUP_KEY = ON)
  6. उदाहरण के लिए:

    CREATE TABLE [dbo].[LargeSourceTable] ( ID int IDENTITY(1,1), [CreateDate] DATETIME CONSTRAINT [DF_LargeSourceTable_CreateDate] DEFAULT (getdate()) NOT NULL, [Column1] CHAR (36) NOT NULL, [Column2] NVARCHAR (100) NOT NULL, [Column3] CHAR (36) NOT NULL, PRIMARY KEY (Column1, Column2) WITH (IGNORE_DUP_KEY = ON) ); GO

  7. नए बनाए गए तालिका के लिए पहले देखे गए विचारों को फिर से बनाएं

  8. अब, निम्नलिखित sql स्क्रिप्ट को चलाएं, आपको परिणाम प्रति पृष्ठ 1,000,000 पंक्तियों में दिखाई देगा, आप परिणामों को अधिक बार देखने के लिए प्रति पृष्ठ पंक्ति संख्या बदल सकते हैं।

  9. ध्यान दें, कि मैंने IDENTITY_INSERTचालू और बंद किया है क्योंकि एक कॉलम में ऑटो वृद्धिशील आईडी है, जिसे मैं भी कॉपी कर रहा हूं

SET IDENTITY_INSERT LargeSourceTable ON DECLARE @PageNumber AS INT, @RowspPage AS INT DECLARE @TotalRows AS INT declare @dt varchar(19) SET @PageNumber = 0 SET @RowspPage = 1000000 select @TotalRows = count (*) from LargeSourceTable_TEMP

While ((@PageNumber - 1) * @RowspPage < @TotalRows )
Begin
    begin transaction tran_inner
        ; with cte as
        (
            SELECT * FROM LargeSourceTable_TEMP ORDER BY ID
            OFFSET ((@PageNumber) * @RowspPage) ROWS
            FETCH NEXT @RowspPage ROWS ONLY
        )

        INSERT INTO LargeSourceTable 
        (
             ID                     
            ,[CreateDate]       
            ,[Column1]   
            ,[Column2] 
            ,[Column3]       
        )       
        select 
             ID                     
            ,[CreateDate]       
            ,[Column1]   
            ,[Column2] 
            ,[Column3]       
        from cte

    commit transaction tran_inner

    PRINT 'Page: ' + convert(varchar(10), @PageNumber)
    PRINT 'Transfered: ' + convert(varchar(20), @PageNumber * @RowspPage)
    PRINT 'Of: ' + convert(varchar(20), @TotalRows)

    SELECT @dt = convert(varchar(19), getdate(), 121)
    RAISERROR('Inserted on: %s', 0, 1, @dt) WITH NOWAIT
    SET @PageNumber = @PageNumber + 1
End

SET IDENTITY_INSERT LargeSourceTable OFF


4

इसमें दो समाधान हैं mysql:

क)DELETE JOIN कथन का उपयोग करके डुप्लिकेट पंक्तियों को हटाएं

DELETE t1 FROM contacts t1
INNER JOIN contacts t2 
WHERE 
    t1.id < t2.id AND 
    t1.email = t2.email;

यह क्वेरी संपर्क तालिका को दो बार संदर्भित करती है, इसलिए, यह तालिका उपनाम t1और का उपयोग करती है t2

आउटपुट है:

1 क्वेरी ठीक है, 4 पंक्तियाँ प्रभावित (0.10 सेकंड)

यदि आप डुप्लिकेट पंक्तियों को हटाना चाहते हैं और रखते हैं lowest id, तो आप निम्न कथन का उपयोग कर सकते हैं:

DELETE c1 FROM contacts c1
INNER JOIN contacts c2 
WHERE
    c1.id > c2.id AND 
    c1.email = c2.email;

   

बी) एक मध्यवर्ती तालिका का उपयोग करके डुप्लिकेट पंक्तियों को हटा दें

निम्नलिखित एक मध्यवर्ती तालिका का उपयोग करके डुप्लिकेट पंक्तियों को हटाने के लिए चरणों को दर्शाता है:

    1. मूल तालिका के समान संरचना के साथ एक नई तालिका बनाएं जिसे आप डुप्लिकेट पंक्तियों को हटाना चाहते हैं।

    2. मूल तालिका से तत्काल तालिका में अलग-अलग पंक्तियाँ डालें।

    3. मूल तालिका से तत्काल तालिका में अलग-अलग पंक्तियाँ डालें।

 

चरण 1. एक नई तालिका बनाएँ जिसकी संरचना मूल तालिका के समान है:

CREATE TABLE source_copy LIKE source;

चरण 2. मूल तालिका से नई तालिका में अलग-अलग पंक्तियाँ डालें:

INSERT INTO source_copy
SELECT * FROM source
GROUP BY col; -- column that has duplicate values

चरण 3. मूल तालिका को छोड़ें और तत्काल तालिका को मूल एक में बदलें

DROP TABLE source;
ALTER TABLE source_copy RENAME TO source;

स्रोत: http://www.mysqltutorial.org/mysql-delete-duplicate-rows/


2
-- this query will keep only one instance of a duplicate record.
;WITH cte
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY col1, col2, col3-- based on what? --can be multiple columns
                                       ORDER BY ( SELECT 0)) RN
         FROM   Mytable)



delete  FROM cte
WHERE  RN > 1

2

आपको फ़ील्ड (एस) के अनुसार डुप्लिकेट रिकॉर्ड द्वारा समूह बनाने की आवश्यकता है, फिर रिकॉर्ड में से एक को पकड़ो और बाकी को हटा दें। उदाहरण के लिए:

DELETE prg.Person WHERE Id IN (
SELECT dublicateRow.Id FROM
(
select MIN(Id) MinId, NationalCode
 from  prg.Person group by NationalCode  having count(NationalCode ) > 1
 ) GroupSelect
 JOIN  prg.Person dublicateRow ON dublicateRow.NationalCode = GroupSelect.NationalCode 
 WHERE dublicateRow.Id <> GroupSelect.MinId)

2

डुप्लिकेट को एक विशाल (कई लाखों रिकॉर्ड) तालिका से हटाने में लंबा समय लग सकता है। मेरा सुझाव है कि आप हटाने के बजाय चयनित पंक्तियों की एक अस्थायी तालिका में एक थोक प्रविष्टि करें।

--REWRITING YOUR CODE(TAKE NOTE OF THE 3RD LINE) WITH CTE AS(SELECT NAME,ROW_NUMBER() 
OVER (PARTITION BY NAME ORDER BY NAME) ID FROM @TB) SELECT * INTO #unique_records FROM 
CTE WHERE ID =1;

2

यह कई तरीकों से किया जा सकता है sql सर्वर ऐसा करने का सबसे सरल तरीका है: डुप्लिकेट पंक्तियों की तालिका से नई अस्थायी तालिका में अलग-अलग पंक्तियों को सम्मिलित करें। इसके बाद डुप्लिकेट पंक्तियों की तालिका से सभी डेटा को हटा दें और फिर सभी डेटा को अस्थायी तालिका से डालें, जिसमें कोई डुप्लिकेट नहीं है जैसा कि नीचे दिखाया गया है।

select distinct * into #tmp From table
   delete from table
   insert into table
   select * from #tmp drop table #tmp

   select * from table

कॉमन टेबल एक्सप्रेशन (CTE) का उपयोग करके डुप्लिकेट पंक्तियों को हटाएँ

With CTE_Duplicates as 
(select id,name , row_number() 
over(partition by id,name order by id,name ) rownumber  from table  ) 
delete from CTE_Duplicates where rownumber!=1


1

Https://support.microsoft.com/en-us/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server के संदर्भ में

डुप्लिकेट को हटाने का विचार शामिल है

  • a) उन पंक्तियों की सुरक्षा करना जो डुप्लिकेट नहीं हैं
  • b) डुप्लिकेट के रूप में एक साथ योग्य कई पंक्तियों में से एक को पुनःप्राप्त करें।

क्रमशः

  • 1) पहले उन पंक्तियों की पहचान करें जो डुप्लिकेट की परिभाषा को संतुष्ट करती हैं और उन्हें अस्थायी तालिका में सम्मिलित करती हैं, #tableAll कहते हैं।
  • 2) गैर-डुप्लिकेट (एकल-पंक्तियों) का चयन करें या अस्थायी तालिका में अलग-अलग पंक्तियों को #tableUnique कहते हैं।
  • 3) डुप्लिकेट को हटाने के लिए #tableAll में शामिल होने वाली स्रोत तालिका से हटाएं।
  • 4) #tableUnique से सभी पंक्तियों को स्रोत तालिका में डालें।
  • 5) ड्रॉप #tableAll और #tableUnique

1

यदि आपके पास अस्थायी रूप से तालिका में एक स्तंभ जोड़ने की क्षमता है, तो यह एक समाधान था जो मेरे लिए काम करता था:

ALTER TABLE dbo.DUPPEDTABLE ADD RowID INT NOT NULL IDENTITY(1,1)

फिर MIN और GROUP BY के संयोजन का उपयोग करके एक DELETE करें

DELETE b
FROM dbo.DUPPEDTABLE b
WHERE b.RowID NOT IN (
                     SELECT MIN(RowID) AS RowID
                     FROM dbo.DUPPEDTABLE a WITH (NOLOCK)
                     GROUP BY a.ITEM_NUMBER,
                              a.CHARACTERISTIC,
                              a.INTVALUE,
                              a.FLOATVALUE,
                              a.STRINGVALUE
                 );

सत्यापित करें कि DELETE ने सही प्रदर्शन किया:

SELECT a.ITEM_NUMBER,
    a.CHARACTERISTIC,
    a.INTVALUE,
    a.FLOATVALUE,
    a.STRINGVALUE, COUNT(*)--MIN(RowID) AS RowID
FROM dbo.DUPPEDTABLE a WITH (NOLOCK)
GROUP BY a.ITEM_NUMBER,
    a.CHARACTERISTIC,
    a.INTVALUE,
    a.FLOATVALUE,
    a.STRINGVALUE
ORDER BY COUNT(*) DESC 

परिणाम में 1. से अधिक की गिनती वाली कोई पंक्तियाँ नहीं होनी चाहिए। अंत में, पंक्ति कॉलम को हटा दें:

ALTER TABLE dbo.DUPPEDTABLE DROP COLUMN RowID;

0

एक चरण में जानकारी खोए बिना डाइजेटेड पंक्तियों को हटाने का दूसरा तरीका निम्नलिखित है:

delete from dublicated_table t1 (nolock)
join (
    select t2.dublicated_field
    , min(len(t2.field_kept)) as min_field_kept
    from dublicated_table t2 (nolock)
    group by t2.dublicated_field having COUNT(*)>1
) t3 
on t1.dublicated_field=t3.dublicated_field 
    and len(t1.field_kept)=t3.min_field_kept

0

अरे वाह, मैं यह सब जवाब तैयार करके बहुत बेवकूफ महसूस करता हूं, वे सभी सीटीई और अस्थायी तालिका और आदि के साथ विशेषज्ञों के जवाब की तरह हैं।

और मैंने इसे काम करने के लिए केवल MAX का उपयोग करके आईडी कॉलम को एकत्र किया।

DELETE FROM table WHERE col1 IN (
    SELECT MAX(id) FROM table GROUP BY id HAVING ( COUNT(col1) > 1 )
)

नोट: आपको डुप्लिकेट को निकालने के लिए इसे कई बार चलाने की आवश्यकता हो सकती है क्योंकि यह केवल एक बार में डुप्लिकेट पंक्तियों के एक सेट को हटा देगा।


यह काम नहीं करेगा क्योंकि यह मूल छोड़ने के बिना सभी डुप्लिकेट को हटा देगा। ओपी मूल रिकॉर्ड को संरक्षित करने के लिए कह रहा है।
0xdd

2
सच नहीं है, अधिकतम आपको अधिकतम आईडी देगा जो स्थिति को संतुष्ट करता है। अगर यह सच नहीं है, तो नीचे दिए गए वोट के लिए अपना मामला साबित करें।
गड़बड़

0
DECLARE @TB TABLE(NAME VARCHAR(100));
INSERT INTO @TB VALUES ('Red'),('Red'),('Green'),('Blue'),('White'),('White')
--**Delete by Rank**
;WITH CTE AS(SELECT NAME,DENSE_RANK() OVER (PARTITION BY NAME ORDER BY NEWID()) ID FROM @TB)
DELETE FROM CTE WHERE ID>1
SELECT NAME FROM @TB;
--**Delete by Row Number** 
;WITH CTE AS(SELECT NAME,ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY NAME) ID FROM @TB)
DELETE FROM CTE WHERE ID>1;
SELECT NAME FROM @TB;

डुप्लिकेट को एक विशाल (कई लाखों रिकॉर्ड) तालिका से हटाने में लंबा समय लग सकता है। मेरा सुझाव है कि आप हटाने के बजाय चयनित पंक्तियों की एक अस्थायी तालिका में एक थोक प्रविष्टि करें। '- CTE AS (Select NAME, ROW_NUMBER () OVER (पार्टिशन बाय NAME ORDER by NAME) ID ID @ @BB से सेलेक्ट करके अपने कोड (3RD LINE पर टिक करें) को सेलेक्ट करें * CTE WHTE ID से # INTO #unique_records का चयन करें = 1; '
इमैनुएल बुल

0
DELETE FROM TBL1  WHERE ID  IN
(SELECT ID FROM TBL1  a WHERE ID!=
(select MAX(ID) from TBL1  where DUPVAL=a.DUPVAL 
group by DUPVAL
having count(DUPVAL)>1))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.