3

重複の可能性:
SQL Server の重複レコードを削除する

COL_A一意のレコードが ( 、 )などの複合キーで示されるテーブルがありますCOL_B

次のクエリを使用して、テーブルに重複する行があることを確認しました。

select COL_A, COL_B, COUNT(*)
from MY_TABLE
group by COL_A, COL_B
having count(*) > 1
order by count(*) desc

今、すべての重複レコードを削除したいのですが、1 つだけを保持します。

誰かが2列でこれを達成する方法に光を当てることができますか?

編集:COL_Aテーブルにはおよび のみがあると仮定しますCOL_B

4

2 に答える 2

2

第 1 の解決策、および よりも多くの列を追加できるため、柔軟性がCOL_AありCOL_Bます。

-- create table with identity filed
-- using idenity we can decide which row we can delete
create table MY_TABLE_COPY
(
  id int identity,
  COL_A varchar(30), 
  COL_B  varchar(30)
  /*
     other columns
  */
)
go
-- copy data
insert into MY_TABLE_COPY (COL_A,COL_B/*other columns*/)
select COL_A, COL_B /*other columns*/
from MY_TABLE
group by COL_A, COL_B
having count(*) > 1
-- delete data from  MY_TABLE
-- only duplicates (!)
delete MY_TABLE
from MY_TABLE_COPY c, MY_TABLE t
where c.COL_A=t.COL_A 
and c.COL_B=t.COL_B
go
-- copy data without duplicates
insert into MY_TABLE (COL_A, COL_B /*other columns*/)
select t.COL_A, t.COL_B /*other columns*/
from MY_TABLE_COPY t
where t.id = (
               select max(id) 
               from MY_TABLE_COPY c  
               where t.COL_A = c.COL_A
               and  t.COL_B = c.COL_B
             ) 
go

2番目の解決策 MY_TABLE に実際に2つの列がある場合は、次を使用できます。

-- create table and copy data
select distinct COL_A, COL_B
into MY_TABLE_COPY
from MY_TABLE
-- delete data from  MY_TABLE 
-- only duplicates (!)
delete MY_TABLE
from MY_TABLE_COPY c, MY_TABLE t
where c.COL_A=t.COL_A 
and c.COL_B=t.COL_B
go
-- copy data without duplicates
insert into MY_TABLE
select t.COL_A, t.COL_B
from MY_TABLE_COPY t
go
于 2012-10-17T18:54:44.850 に答える
1

試す:

-- Copy Current Table
SELECT * INTO #MY_TABLE_COPY FROM MY_TABLE 

-- Delte all rows from current able
DELETE FROM MY_TABLE

-- Insert only unique values, removing your duplicates
INSERT INTO MY_TABLE
SELECT DISTINCT * FROM #MY_TABLE_COPY

-- Remove Temp Table
DROP TABLE #MY_TABLE_COPY

MY_TABLE から行を削除するときに外部キーを壊さない限り、これはうまくいくはずです。

于 2012-10-17T19:36:26.263 に答える