[SQL] 일련번호에서 빠진 번호 찾기

SELECT 쿼리를 이용하다보면 일련번호에서 삭제가 되어 빠진 번호를 찾아야 할 경우가 있습니다.
이럴때 다음과 같은 쿼리를 이용하면 유용합니다.

1. ROW_NUMBER 를 이용한방법

	SELECT MAX( A.[컬럼명] ) + 1
	FROM 
	( 
		SELECT  TOP 100 PERCENT [컬럼명], ROW_NUMBER() OVER ( ORDER BY [컬럼명] ) AS RNUM
		FROM [테이블명] ORDER BY [컬럼명]
	) A 
	WHERE A.[컬럼명] = A.RNUM 

간단히 설명하면 FROM 절안의 구문만 실행 시켜 보면 다음테이블이 됩니다.

컬럼명 RNUM
1 1
2 2
3 3
7 4
8 5
9 6

이중 “WHERE A.[컬럼명] = A.RNUM” 를 거치면 위의 3항만 남게 됩니다. 그중에서 “MAX( A.[컬럼명] ) + 1” 로 SELECT 하게 되면 마지막 3 + 1인 4가 결과값으로 나오게 됩니다.

이 방법은 순차 컬럼을 만들고 현재 빠진 컬럼 과 비교하여 가장 큰값에 +1을 하여 비어 있는 숫자 1개를 취하는 방법입니다.
참고로 “TOP 100 PERCENT” 부분은 MSSQL 에서 나는 문법 오류를 커버하기 위한 방법입니다.

2. 현재 컬럼 +1 과 현재컬럼 비교

SELECT min([컬럼명]+1)
FROM [테이블명]
WHERE ([컬럼명]+1) NOT IN (SELECT [컬럼명] FROM [테이블명])

참 간단합니다. 짧게 설명을 드리면 현재 인덱스의 모든값에 + 1 을 합니다.
그리고 현재 인덱스와 비교해봅니다. 비교해서 존재하지 않는 숫자들을 찾고 그중 가장 작은 수가 비어있는 첫번째 수가 됩니다. 약간만 바꾸면 빠진번호의 최대값도 구할 수 있고

아무래도 위의 1번 보다는 쓰임새가 더 많을것 같은데요. 위의 1번 방법은 변형해서 여러가지로 쓰일 수 있어서 안좋은 방법이다라고 얘기 할 수 없습니다. 각각의 장 단점이 있습니다.

Leave a Comment