가끔은 한 테이블에서 검색을 할 때 무작위로 뽑아내고 싶은 경우가 있습니다. 예를 들어 추첨을 하는 경우 필요할 수 있는 요구사항입니다. 이에 대한 아주 간단한 방법을 소개해 드립니다.
1. newid() 함수
NEWID() 함수는 수행이 될 때마다 전혀 중복되지 않는 임의의 값을 만들어 리턴해줍니다. 만일 다음과 같이 newid() 함수의 결과를 SELECT 해보면
|
SELECT newid() |
결과는 다음과 같습니다.
|
E78CAC2D-85DD-415B-9EEF-2FCBB93A05D3 |
한번 두 수행해 보면 결과는 다음과 같습니다.
|
C71014B6-F286-4E4C-B438-05CE509B9BDE |
2. newid() 함수를 이용한 무작위 추출
위 내용을 이용하면 무작위로 테이블에서 행을 얻어 낼 수 있습니다. 만일 다음과 같이 Titles 테이블에서 5개의 title_id를 얻는 쿼리문이 있다고 가정하겠습니다.
|
USE Pubs SELECT TOP 5 title_id FROM titles |
위 SELECT 문이 수행이 되면 매번 동일한 결과를 얻게 됩니다. Titles 테이블의 값이 변경되지 않는한 똑같은 경과가 나올 수 밖에 없습니다.
하지만 다음과 같이 ORDER BY 문을 사용하게 되면 결과는 매번 달라집니다.
USE Pubs SELECT TOP 5 title_id FROM titles |
위와 같이 하면 쿼리가 수행되는 중에 newid() 함수에 의해 각 행에 임의의 값이 만들어지고 그 값을 기준으로 정렬해서 상위 5개의 행만을 얻게 되므로 결과가 매번 달라지게 됩니다. 우선 처음 수행을 시켜보면 결과는 다음과 같습니다.
title_id (5개 행 적용됨) |
한번 더 수행해보면 결과는 다음과 같습니다.
title_id (5개 행 적용됨) |
결과가 계속 달라짐을 알 수 있습니다. 확인해 보세요~
3. 정리
참 편리하죠? 만일 위 기능을 추첨에 사용한다고 한다면 한번 추첨된 값은 대상에서 제외하는 처리 루틴을 포함해야 합니다. SELECT 된 결과는 다른 테이블에 기록을 하고 그 테이블에 존재하는 대상을 제외하고 SELECT 되도록 하면 쉽게 해결이 됩니다.
[출처] [mssql]임의의 행 무작위 추출|작성자 필립박
'데이터베이스 > SQL Server' 카테고리의 다른 글
[mssql]SQL에서 블록킹과 데드락을 처리하기 위해서 어떻게 해야 되나요? (0) | 2008.04.29 |
---|---|
[mssql]Cross-Tab Query(SP이용X) (0) | 2008.04.29 |
MS SQL Server 성능 조정 및 최적화 (0) | 2008.04.29 |
SQL2000 Table Hints 관련 문서 (0) | 2008.04.29 |
mssql 함수모음 (0) | 2008.04.29 |