SQL Server 2005를 사용하는 서비스가 있는데, P.K도 없는 테이블을 만들고는 거기에 중복된 값을 넣었더군요. 젠장 뭔놈의 설계를... 암튼... db를 복제해놓으려고 했더니 이 P.K없는 테이블이 걸리더군요. 그래서 pk를 넣어주기 위해서 중복 data 삭제를 시작하려했습니다. 근데... 이거 참... ROWNUM 같은걸 찾기가 힘들더군요. 고심끝에 임시 테이블을 만드는 방법을 쓰기로 했습니다.
물론 다른 방법이 충분히 존재할거 같은 느낌이 듭니다. 그러나... 너무 오랜 시간 동안 이 문제를 잡고 있을수는 없으니까요. 다른 좋은 방법을 알고 계시면 알려주시면 감사하겠습니다. 그럼 평온한 하루 보내시길...
물론 다른 방법이 충분히 존재할거 같은 느낌이 듭니다. 그러나... 너무 오랜 시간 동안 이 문제를 잡고 있을수는 없으니까요. 다른 좋은 방법을 알고 계시면 알려주시면 감사하겠습니다. 그럼 평온한 하루 보내시길...
1. 기존 DATA를 백업 테이블에 백업한다.
SELECT * INTO dbo.LIST1_BK FROM dbo.LIST1;
2. 중복된 ROW의 번호를 확인한다.
SELECT A.*
FROM (select ROW_NUMBER()OVER(ORDER BY VALUE2) AS SEQ1, * from dbo.LIST1) A;
3. 중복된 ROW의 번호를 제외한 나머지 DATA를 임시 테이블에 입력한다.
INSERT INTO dbo.LIST1_TEMP(VALUE1, VALUE2)
SELECT A.VALUE1, A.VALUE2
FROM (SELECT ROW_NUMBER()OVER(ORDER BY VALUE2) AS SEQ1, * FROM dbo.LIST1) A
WHERE A.SEQ1 NOT IN (6, 10);
4. 원본 테이블의 DATA를 삭제한다.
DELETE FROM dbo.LIST1;
5. 임시 테이블의 DATA를 원본 테이블에 입력한다.
INSERT INTO dbo.LIST1(VALUE1, VALUE2)
SELECT VALUE1, VALUE2 FROM dbo.LIST1_TEMP
SELECT * INTO dbo.LIST1_BK FROM dbo.LIST1;
2. 중복된 ROW의 번호를 확인한다.
SELECT A.*
FROM (select ROW_NUMBER()OVER(ORDER BY VALUE2) AS SEQ1, * from dbo.LIST1) A;
3. 중복된 ROW의 번호를 제외한 나머지 DATA를 임시 테이블에 입력한다.
INSERT INTO dbo.LIST1_TEMP(VALUE1, VALUE2)
SELECT A.VALUE1, A.VALUE2
FROM (SELECT ROW_NUMBER()OVER(ORDER BY VALUE2) AS SEQ1, * FROM dbo.LIST1) A
WHERE A.SEQ1 NOT IN (6, 10);
4. 원본 테이블의 DATA를 삭제한다.
DELETE FROM dbo.LIST1;
5. 임시 테이블의 DATA를 원본 테이블에 입력한다.
INSERT INTO dbo.LIST1(VALUE1, VALUE2)
SELECT VALUE1, VALUE2 FROM dbo.LIST1_TEMP
'IT 기술 > Database' 카테고리의 다른 글
MS SQL Server에서 PostgreSQL의 data 가져오기 혹은 보내기 (0) | 2011.03.14 |
---|---|
DB 복제, Data 동기화 솔루션에 대한 고민 (0) | 2010.11.16 |
MS SQL Server 2005 서버 튜닝 (1) - tempdb 및 file 관련 설정 (0) | 2010.08.13 |
Tibero4 migration 모험기 (4) 중간정리 : Oracle DBA의 Tibero 사용 후기 (0) | 2010.06.16 |
SQL Unplugged "괴물 이야기" 참석 후기 (0) | 2010.06.14 |