এসকিউএল সার্ভারে সদৃশ সারিগুলি কীভাবে মুছবেন?


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
এটি প্রথম লিঙ্কের একটি ডুপ নয়। এই প্রশ্নে কোনও সারি আইডি নেই এবং সংযুক্ত প্রশ্নে একটি সারি আইডি রয়েছে। খুব আলাদা।
Alien Technology

সমন্বিত ফাংশন যেমন ম্যাক্স / এমআইএন রাখতে 'সারণী আইডি থেকে গ্রাহক আইডি হ'ল' নির্বাচন করুন এবং এটি কাজ করা উচিত।
তছনছ আপ

উত্তর:


785

আমি ও CTEs মত 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
একটি দুর্দান্ত উত্তরের জন্য আপনাকে ধন্যবাদ। বিপরীতে এমএসএফটিটির একটি জটিল উত্তর এখানে রয়েছে: stackoverflow.com/questions/18390574/…
বারকা

2
@ ওমাচু 23: এক্ষেত্রে এটি কোনও ব্যাপার নয়, যদিও আমি মনে করি এটি সিটিইতে বাইরের চেয়ে বেশি দক্ষ ( AND COl1='John')। সাধারণত আপনার ফিল্টারটি সিটিইতে প্রয়োগ করা উচিত।
টিম শেমলেটার

1
@ omachu23: আপনি কোটে (পৃথক্ ক্রম থেকে) যে কোন এসকিউএল ব্যবহার করতে পারেন, তাই যদি আপনি জনস দ্বারা ফিল্টার করতে চাই: ...FROM dbo.Table1 WHERE Col1='John'। এই হিটলটি
টিম শেমলেটার

1
সবচেয়ে সহজ সমাধানটি এখানেset rowcount 1 delete from t1 where col1=1 and col2=1 যেমন দেখা যায়
জোরগারথ

15
এই উত্তরটি কেবল সেই সারিগুলি মুছে ফেলবে যা কল 1 এ সদৃশ রয়েছে। "বিভাজন দ্বারা" "নির্বাচন করুন" তে কলামগুলি যুক্ত করুন, উদাহরণস্বরূপ উত্তরে নির্বাচন করুন: RN = ROW_NUMBER () ওভার (কল 1, কল 2, কল 3, কল 4, কল 5, কল 6, কল 7 অর্ডার বাই অর্ডার)
11

158

আমি স্কিল সার্ভার টেবিল থেকে সদৃশ সারি মুছে ফেলার জন্য সিটিই পছন্দ করব

এই নিবন্ধটি দৃ strongly ়ভাবে অনুসরণ করার জন্য দৃ :: ়ভাবে পরামর্শ দিন :: http://codaffication.com/sql-server-article/delete-d નકલate-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
উইন্ডোভিং ফাংশন একটি দুর্দান্ত সমাধান।
রবার্ট কেসি

2
আমি একটু বিভ্রান্ত আপনি এটি সিটিই থেকে মুছে ফেলেছেন মূল টেবিলটি নয়। সুতরাং কিভাবে এটি কাজ করে?
বিগাইজ

8
@ বিগাইজস সিটিই থেকে রেকর্ড মুছে ফেলা প্রকৃত শারীরিক টেবিল থেকে সংশ্লিষ্ট রেকর্ডগুলি সরিয়ে ফেলবে because (কারণ সিটিইতে প্রকৃত রেকর্ডগুলির সাথে উল্লেখ রয়েছে)।
শমসির কে

এই পোস্ট না হওয়া পর্যন্ত আমার ধারণা ছিল না ... ধন্যবাদ
জাক্ক ডিয়াজ

1
আপনি কেন মূল এবং এর সদৃশ দুটি মুছতে চান? আমি বুঝতে পারছি না আপনি কেন কেবল নকলটি সরিয়ে অন্যটিকে রাখতে চান না।
ধনী

52

ব্যবহার না করে CTEএবং ROW_NUMBER()আপনি কেবল MAXএখানে ফাংশন সহ গ্রুপ ব্যবহার করে রেকর্ডগুলি মুছতে পারেন is

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

4
এই কোয়েরিটি নন-সদৃশ রেকর্ডগুলি মুছে ফেলবে।
ডেরেক স্মলস

8
এটি ভাল কাজ করে, আপনাকে ধন্যবাদ। @ ডেরেকসমল এগুলি আমার অ-সদৃশ রেকর্ডগুলি সরিয়ে দেয় না।
মন্টেইরোব্রেনা

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
আমি বিশ্বাস করি না থাকার বা ইউনিয়ন ব্যবহারের কোনও প্রয়োজন নেই, এটি যথেষ্ট হবে: অনুসন্ধান থেকে মুছে ফেলুন যেখানে ইউআরএল দ্বারা অনুসন্ধান দল থেকে মিনিট (আইডি) নির্বাচন করবেন না
ক্রিস্টোফার ইয়াং

9

নিচের উপায়টিও মুছে ফেলুন see

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

ডুপ্লিকেটগুলি কীভাবে সরিয়ে ফেলা যায় সে সম্পর্কে মাইক্রোসফ্টের একটি vey ry ঝরঝরে গাইড রয়েছে। পরীক্ষা করে দেখুন http://support.microsoft.com/kb/139444

সংক্ষেপে, আপনার মুছে ফেলার জন্য যখন কেবল কয়েকটি সারি থাকবে তখন ডুপ্লিকেটগুলি মোছার সহজতম উপায়:

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

myprimarykey সারি জন্য সনাক্তকারী।

আমি সারিটিতে 1 এ সেট করেছিলাম কারণ আমার কাছে কেবল দুটি সারি ছিল যা সদৃশ হয়েছিল। যদি আমার কাছে 3 টি সারি নকল হয়ে থাকে তবে আমি সারিসংখ্যক 2 তে সেট করে রেখেছিলাম যাতে এটি প্রথম দুটি মুছে যায় যা এটি দেখায় এবং কেবল একটি টেবিলের T1 এ রেখে দেয়।

আশা করি এটি যে কাউকে সাহায্য করবে


1
আমার কাছে 10 কে সারি থাকলে আমি কয়টি সারি সদৃশ করে তা জানতে পারি?
ভয়ঙ্কর

@ ফেরেঘল চেষ্টা করুন "প্রাথমিককি দ্বারা আমার টেবিল গ্রুপ থেকে প্রাথমিককি, গণনা (*) নির্বাচন করুন;"
ওবারকা

1
তবে যদি সেখানে নকল সারিগুলির বিবিধ সংখ্যা থাকে? উদাহরণস্বরূপ, সারিতে A এর 2 টি রেকর্ড রয়েছে এবং সারি খ এর 5 টি রেকর্ড রয়েছে এবং সারি গ এর কোনও সদৃশ রেকর্ড নেই
থার্মাইট

1
@ user2070775 কী হবে যদি কেবল সমস্ত সারির একটি উপসেটে সদৃশ থাকে এবং সেই নকলগুলির মধ্যে কিছু দু'বার নকল হয় এবং কিছু তিন বা চার বার?
থার্মিট্

@ ব্যবহারকারী2070775 আপনি যে অংশটি "মুছে ফেলতে কেবল কয়েক সারি" বলেছিলেন তা আমি মিস করেছি। এছাড়াও সেট রোউকাউন্ট সম্পর্কে পৃষ্ঠায় একটি সতর্কতা রয়েছে যে স্কয়ারের ভবিষ্যতের সংস্করণগুলিতে এটি আপডেটের উপর প্রভাব ফেলবে না বা বিবৃতি মুছে ফেলবে
থার্মাইট

6

ব্যবহার করার চেষ্টা করুন:

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

এখানে চিত্র বর্ণনা লিখুন


4

উপরে প্রস্তাবিত সমাধানটি চেষ্টা করার পরে, এটি ছোট মাঝারি টেবিলগুলির জন্য কাজ করে। আমি খুব বড় টেবিলের জন্য সমাধানটি প্রস্তাব করতে পারি। যেহেতু এটি পুনরাবৃত্তিতে সঞ্চালিত হয়।

  1. এর সমস্ত নির্ভরতা দর্শনগুলি ফেলে দিন LargeSourceTable
  2. আপনি এসকিউএল ম্যানেজমেন্ট স্টুডিও ব্যবহার করে নির্ভরতাগুলি খুঁজে পেতে পারেন, টেবিলে ডান ক্লিক করুন এবং "নির্ভরতা দেখুন" ক্লিক করুন
  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. এখন, নীচের স্কয়ার স্ক্রিপ্টটি চালান, আপনি প্রতি পৃষ্ঠায় ১,০০,০০০ সারিতে ফলাফলগুলি দেখতে পাবেন, ফলাফলগুলি প্রায়শই দেখতে আপনি প্রতি পৃষ্ঠায় সারি সংখ্যা পরিবর্তন করতে পারেন।

  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. কাঠামোর সাথে একটি নতুন টেবিল তৈরি করুন যা আপনি নকল সারিগুলি মুছতে চান তার মূল টেবিলের সমান।

    ২. আসল টেবিল থেকে তাত্ক্ষণিক সারণিতে স্বতন্ত্র সারি .োকান।

    ৩. আসল টেবিল থেকে তাত্ক্ষণিক সারণিতে স্বতন্ত্র সারি .োকান।

 

পদক্ষেপ 1. একটি নতুন টেবিল তৈরি করুন যার কাঠামোটি মূল টেবিলের সমান:

CREATE TABLE source_copy LIKE source;

পদক্ষেপ 2. মূল টেবিল থেকে নতুন সারণিতে স্বতন্ত্র সারি সন্নিবেশ করান:

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

পদক্ষেপ ৩. আসল টেবিলটি ফেলে দিন এবং তাত্ক্ষণিক টেবিলটির মূল নামকরণ করুন

DROP TABLE source;
ALTER TABLE source_copy RENAME TO source;

সূত্র: http://www.mysqltutorial.org/mysql-delete-dusedate-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

এটি এসকিএল সার্ভারে বিভিন্ন উপায়ে করা যায় এটির সর্বাধিক সহজতম উপায়: সদৃশ সারি সারণী থেকে নতুন অস্থায়ী সারণিতে স্বতন্ত্র সারিগুলি সন্নিবেশ করান। তারপরে নকল সারি টেবিল থেকে সমস্ত ডেটা মুছুন এবং তারপরে অস্থায়ী টেবিল থেকে সমস্ত ডেটা সন্নিবেশ করুন যা নীচের মত দেখায় যেমন কোনও সদৃশ নেই।

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

   select * from table

সাধারণ সারণী এক্সপ্রেশন (সিটিই) ব্যবহার করে সদৃশ সারিগুলি মুছুন

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-d সদৃশ-rows-from-a-table-in-sql-server প্রসঙ্গে

সদৃশ অপসারণের ধারণার সাথে জড়িত

  • ক) নকল নয় এমন সারিগুলি রক্ষা করা
  • খ) ডুপ্লিকেট হিসাবে একসাথে যোগ্যতা অর্জনকারী অনেকগুলি সারির মধ্যে একটি পুনরুদ্ধার করুন।

ধাপে ধাপে

  • 1) প্রথমে সারিগুলি চিহ্নিত করুন যা সদৃশ সংজ্ঞা পূরণ করে এবং এগুলি টেম্প টেবিলের মধ্যে সন্নিবেশ করান, # টেবিলএল বলুন।
  • 2) অ-সদৃশ (একক-সারি) বা স্বতন্ত্র সারিগুলি টেম্প টেবিলের মধ্যে নির্বাচন করুন # টেবিল ইউনিক বলুন।
  • 3) সদৃশ টেবিল থেকে মুছুন # ডাবলিকেটগুলি মুছতে সমস্ত টেবিলের সাথে যোগ দিন।
  • 4) # টেবিল ইউনিক থেকে সমস্ত সারি উত্স সারণীতে .োকান।
  • 5) ড্রপ # টেবিলআল এবং # টেবিল ইউনিক

1

আপনার যদি অস্থায়ীভাবে টেবিলে একটি কলাম যুক্ত করার ক্ষমতা থাকে তবে এটি আমার জন্য কাজ করা একটি সমাধান ছিল:

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

তারপরে MIN এবং GROUP BY এর সংমিশ্রণটি ব্যবহার করে একটি বিলোপ সম্পাদন করুন

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
                 );

ডিলিট সঠিকভাবে সম্পাদন করেছেন তা যাচাই করুন:

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 টির চেয়ে বেশি একটি গণনা সহ কোনও সারি থাকা উচিত না Finally

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;

বিশাল (কয়েক মিলিয়ন রেকর্ড) টেবিল থেকে নকল মুছতে দীর্ঘ সময় নিতে পারে। আমি প্রস্তাব দিচ্ছি যে আপনি নির্বাচিত সারিগুলির মোছা টেম্পলটি মোছার পরিবর্তে একটি বাল্ক সন্নিবেশ করান। '- আপনার কোড (3RD লাইন গ্রহণ করুন) হিসাবে সিটিই হিসাবে লিখুন (সিলেক্ট নাম, ROW_NUMBER () নাম অনুসারে নাম (টিটিবি দ্বারা নাম) আইডি থেকে @ টিটি) নির্বাচন করুন * সিটিই কোথাও আইডি = 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))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.