2012-10-17 1 views
3

가능한 중복 :
delete duplicate records in SQL ServerTSQL 쿼리는 모든 중복 레코드를 삭제하지만, 하나의

나는 등의 고유 한 기록이 복합 키에 의해 표시되는 테이블 (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 

, 나는 모든 중복 레코드를 제거하지만 하나를 유지하고 싶습니다.

누군가 2 열을 사용하여이를 달성하는 방법에 대해 설명해 줄 수 있습니까?

편집 : 테이블은 COL_ACOL_B

+1

나머지 열은 동일합니까? 어떤 것을 보관할 것인지 어떻게 결정합니까? – FJT

+0

@FionaT,이 경우, 하나를 유지하는 한 계속 유지하지 않습니다. 이것은 모두 동일한 (COL_A, COL_B) 쌍을 가지고 있기 때문입니다. 간단히하기 위해 COL_A 및 COL_B 만 있습니다. – czchlong

+1

다른 필드 (잘하면 키 필드)가없는 경우 delete 문은 모든 레코드를 삭제합니다. 레코드를 구별 할 수있는 다른 필드가 있어야합니다. –

답변

2

1 솔루션, 당신이 COL_ACOL_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 

두 번째 해결책 정말로 두 개의 col MY_TABLE에서 umns 당신은 사용할 수 있습니다

-- 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 
+0

방금 ​​MY_TABLE_COPY에 INSERT 할 때 SELECT DISTINCT를 사용할 수있었습니다. 그런 다음 하위 쿼리를 다시 삽입 할 때 where 절이 필요하지 않습니다. 그래도 유일성의 부족을 해결하기위한 투표. –

+0

@Data Masseur Thanks. 네, SELECT DISTINCT를 사용할 수 있습니다 만, MY_TABLE에 2 열 이상 있으면 작동합니다. – Parado

+0

@DataMasseur 제안 사항을 게시하여 게시물을 편집했습니다. – Parado

1

시도를 : 한 MY_TABLE에서 행을 삭제할 때 어떤 외래 키를 중단하지 않는 한 작동합니다

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

.