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 테이블의 중복 문제를 자신 있게 해결할 수 있습니다. 쿼리 작업을 즐기세요!