Problem

Primary Key 없는 테이블에 동일한 값의 중복된 행이 있다면 구별하기가 어렵습니다..

경우 여러분은 중복된 행을 어떻게 삭제 하시나요?

 

Solution

SET ROWCOUNT 옵션을 사용. 사용자가 지정한 행수를 반환하여 중복된 행을 삭제하며

기본적으로는 SET ROWCOUNT 0 옵션은 모든 행이 반환 됩니다.

 

아래 예제를 이용하여 Test 보겠습니다.

 

1. Test테이블 생성 데이터 입력

CREATE TABLE dbo.duplicateTest

(

ID int,

FirstName nvarchar(25),

LastName nvarchar(25)

)

 

INSERT INTO dbo.duplicateTest VALUES ( 1 , N'' , N'동건' )

INSERT INTO dbo.duplicateTest VALUES ( 2 , N'' , N'소영' )

INSERT INTO dbo.duplicateTest VALUES ( 3 , N'' , N'지현' )

INSERT INTO dbo.duplicateTest VALUES ( 1 , N'' , N'동건' )

 

 

2. 전체 행을 조회합니다.

SELECT * FROM dbo.duplicateTest;

2.jpg

 

3. 삭제 대상인 중복된 행을 조회해 봅니다.

SELECT * FROM dbo.duplicateTest WHERE ID = 1 AND FirstName = N'' AND LastName = N'동건'

3.jpg

 

4. 위에서 언급했듯이 중복된 삭제를 위해 SET ROWCOUNT 옵션을 사용하여 삭제합니다.

SET ROWCOUNT 1 --반환행수지정

DELETE FROM dbo.duplicateTest WHERE ID = 1

SET ROWCOUNT 0 --해제

 

5. 삭제 결과 확인

SELECT * FROM dbo.duplicateTest

4.jpg

 

결과와 같이 중복된 2개의 SET ROWCOUNT 1 옵션으로 인해

1개의 행만 영향을 받은 것을 확인하실 있습니다.

 

 

추가적으로 SQL 2005 이후 버전은 TOP 절을 이용하셔도 됩니다.

 

1. 전체 행을 조회합니다.

SELECT * FROM dbo.duplicateTest

2.jpg

 

2. TOP 절을 사용하여 삭제합니다.

DELETE TOP (1) FROM dbo.duplicateTest WHERE ID = 1

 

3. 삭제 결과 확인

SELECT * FROM dbo.duplicateTest

4.jpg

 

 

그렇다면 삭제해야 중복값이 multiple 하다면 어떻게 해야 될까요?

위에서 말씀 드린 TOP 응용하시면 되겠습니다.

 

1. 중복값을 100 입력합니다.

INSERT INTO dbo.duplicateTest VALUES ( 1 , N'' , N'동건' )

GO 100

  

2. 입력된 행을 확인합니다.

SELECT * FROM dbo.duplicateTest;

5.jpg 

 

 

3. TOP절과 카운트 쿼리를 이용해서 사용자가 원하는 수만을 남기고

    나머지는 지우도록 합니다. 3개만 남기고 지워 보도록 하죠...

DELETE TOP ( SELECT COUNT (*) - 3 FROM dbo.duplicateTest WHERE ID = 1 )

FROM dbo.duplicateTest

WHERE ID = 1;

 

4. 결과를 확인합니다.

SELECT * FROM dbo.duplicateTest;

6.jpg 

 

간단한 내용이지만 막상 생각 안 날 때가 가끔 있어서 Posting 해봅니다.

 

 

 





profile