SQL Server 테이블에서 중복 행을 쉽게 제거하는 방법

데이터베이스를 정리하는 것은 데이터 품질을 유지하는 데 필수적입니다. 특히 중복 행에 관해서는 더욱 그렇습니다. 30만 개 이상의 행을 포함하는 대규모 SQL Server 테이블을 다루고 있다면, 제거하고자 하는 중복 항목이 발생할 수 있습니다. 이 블로그 포스트에서는 관련 데이터를 온전히 유지하면서 중복을 효과적으로 제거하는 간단한 과정을 안내합니다.

문제 이해하기

MyTable과 같은 테이블에는 아이디 필드가 있는 기본 키(RowID)가 포함되어 있어도 중복 항목이 완벽한 일치를 이루지 않을 수 있습니다. 대신, Col1, Col2, Col3과 같은 하나 이상의 비키 컬럼에서 다를 수 있습니다. 이러한 중복 항목을 스마트하게 식별하는 것이 중요합니다. 데이터 손실을 방지하면서 테이블의 무결성을 확보해야 합니다.

MyTable의 예시 구조

RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null

해결책 설명

관련 행을 유지하면서 중복 행을 효과적으로 제거하기 위해 SQL Server의 GROUP BY 문과 DELETE 명령을 활용할 수 있습니다. 아래는 명확성을 위해 단계별로 나누어 설명합니다.

단계별 가이드

1. 중복 체크를 위한 그룹화 및 고유 행 선택

첫 번째 단계는 중복을 체크하고자 하는 컬럼(Col1, Col2, Col3)에 따라 행을 그룹화하는 것입니다. MIN 함수를 사용하여 중복 그룹에서 가장 작은 RowID를 찾아야 하며, 이를 통해 어떤 행을 유지할지 안내받습니다.

SQL 코드 예시는 다음과 같습니다:

SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
FROM MyTable 
GROUP BY Col1, Col2, Col3

2. 중복 행 삭제

어떤 행을 유지할 것인지 식별했다면, 다음 단계는 새로 생성된 KeepRows 세트와 일치하지 않는 모든 항목을 삭제하는 것입니다. 행 삭제를 수행하는 SQL 코드는 다음과 같습니다:

DELETE FROM MyTable
LEFT OUTER JOIN (
   SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
   FROM MyTable 
   GROUP BY Col1, Col2, Col3
) as KeepRows ON
   MyTable.RowId = KeepRows.RowId
WHERE
   KeepRows.RowId IS NULL

이 명령은 다음과 같은 작업을 수행합니다:

  • MyTable과 계산된 KeepRows 간에 LEFT OUTER JOIN을 수행합니다.
  • KeepRows와 일치하지 않는 RowId를 가진 MyTable의 모든 행이 삭제됩니다.

고유 식별자 처리하기

테이블에 행 식별을 위한 정수 대신 GUID가 포함된 경우, 최소 선택 항목을 단순히 조정하면 됩니다. 다음과 같이 변경합니다:

MIN(RowId)

를:

CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn)))

이렇게 하면 데이터 유형의 무결성을 유지하면서 최소 GUID를 올바르게 식별할 수 있습니다.

결론

SQL Server에서 중복 행을 제거하는 것은 GROUP BY 및 관련 조인과 삭제 기술을 사용하여 효율적으로 수행할 수 있습니다. 이러한 단계를 따르면 중요한 데이터 손실 위험 없이 깔끔하고 기능적인 데이터베이스를 유지할 수 있습니다. 대량 삭제를 수행하기 전에 항상 데이터베이스를 백업하는 것을 잊지 마세요!

여기서 얻은 지식을 바탕으로 SQL 테이블의 중복 문제를 자신 있게 해결할 수 있습니다. 쿼리 작업을 즐기세요!