Loading
2010. 9. 14. 14:55 - 나쁜철군

MSSQL 중복값 삭제방법

안녕하세요 데이터를 복사하면서 중복값 검사없이 데이터를 복사해와서 고생하시는 분들을 위해 포스트를 작성합니다.

 

우선 해당 DB는 MS-SQL 2000입니다.

그러므로, rowID 나 ROWNUM 같은 것을 지원하지 않습니다. 오라클과 MSSQL2005부터 지원한다는군요.

 

점!!

1. 원본테이블과, 중복된 값이 있는 현재 테이블의 값들의 손상이 전혀없다!!(중복파일만 삭제)

2. 간편 하면서도 금방 끝낸다

3. 네이버 지식인에서 안가르쳐주거나, 이상한 헛소리를 해서 짜증난다! 테스트 테이블일 지언정 다 지우고 다시 가져오기 싫다!!!

 

▣ 증상

우선 테이블 원본입니다.

 

이 값들을 화끈하게 8번 중복 시켜 버리겠습니다.

 

▣ 중복값 삭제 방법

1. 엔터프라이즈 메니저를 실행

2. 해당 테이블에서 마우스 오른쪽 을 눌러 [테이블 디자인]을 선택합니다.

3. 테이블 디자인에서 [컬럼]을 하나 추가합니다.

4. [del_num] 이라고 예제에서는 이름을 지었습니다. INT 로 하시고, NULL 허용 체크 해제 합니다.

5. 속성에는 ID를 [YES]로 변경하시면, 시작값과 증가값을 설정하실수 있습니다. 시작값 1, 증가값 1로 설정하였습니다. 마음대로 설정해도 상관없습니다.

 

6. 보시면 임의 값이 삽입되어 있는것을 확인 하실 수 있습니다.

 

 

7. 쿼리 분석기에서 다음과 같이 쿼리문을 씁니다. 이미지를 보시면 아시겠지만, 저는 다음과 같이 쿼리문을 작성하였습니다.

예제)

select * from 테이블이름

order by [추가된컬럼]

실행)

select [del_num] as 추가된컬럼, * from [book]
order by [del_num] asc

 

 

8. 이제 중복된 값을 1개만 남기고 전부 삭제 해 보겠습니다. 쿼리는 다음과 같습니다.

예제)

delete 테이블이름 where [추가된컬럼]
 in (select 테이블별명A.[추가된컬럼] from 테이블이름 테이블별명A, 테이블이름 테이블별명B where 테이블별명A.[추가된컬럼] < 테이블별명B.[추가된컬럼]
and 테이블별명A.[중복컬럼1]=테이블별명B.[중복컬럼1] and 테이블별명A.[중복컬럼2]=테이블별명B.[중복컬럼2] and .....)

 

실행)

delete book where del_num
 in (select T1.del_num from book T1, book T2 where T1.del_num < T2.del_num
and T1.BID=T2.BID)

 

9. 결과는 다음과 같습니다.

 

10. 이제 추가했던 컬럼을 지웁니다. 엔터프라이즈 메니저로 가서 [테이블디자인]을 선택합니다. 그리고 해당 컬럼을 삭제후 저장합니다.

 

11. 마지막으로 확인합니다.

 

이상입니다.

참 쉽죠 ^^

 

이 포스트를 쓴 이유가... 대부분의 답변자들이 너무나 쉽게 DB를 생각하시는 것 같습니다.

MS-SQL2000을 쓰시는분들이 의외로 많기 때문에 MS-SQL2005 나 오라클 처럼 지원 안되는게 많습니다.

또한 테스트 테이블이라고 해도 완전히 삭제후 다시 값을 채우는 것은 꺼림직하기도 하구요, 그게 만약 상용서버에서 중복이 일어났을경우는 빠른 대처를 위해서 데이터를 전부 리셋할 수 없을때가 있습니다만, 이런 상황을 대부분 고려하지 않고 답변을 올리는 답변자가 많았기 때문입니다.

 

아무쪼록 속타고 머리 아픈 이런 일을 겪고 계시는 여러분들에게 도움이 되었으면 합니다.

그럼 이만.