가끔은 한 테이블에서 검색을 할 때 무작위로 뽑아내고 싶은 경우가 있습니다. 예를 들어 추첨을 하는 경우 필요할 수 있는 요구사항입니다. 이에 대한 아주 간단한 방법을 소개해 드립니다.

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
GO

SELECT TOP 5 title_id FROM titles

위 SELECT 문이 수행이 되면 매번 동일한 결과를 얻게 됩니다. Titles 테이블의 값이 변경되지 않는한 똑같은 경과가 나올 수 밖에 없습니다.

하지만 다음과 같이 ORDER BY 문을 사용하게 되면 결과는 매번 달라집니다.


USE Pubs
GO

SELECT TOP 5 title_id FROM titles
ORDER BY newid()

위와 같이 하면 쿼리가 수행되는 중에 newid() 함수에 의해 각 행에 임의의 값이 만들어지고 그 값을 기준으로 정렬해서 상위 5개의 행만을 얻게 되므로 결과가 매번 달라지게 됩니다. 우선 처음 수행을 시켜보면 결과는 다음과 같습니다.


title_id
--------
MC2222
BU7832
BU1032
PC8888
MC3026

(5개 행 적용됨)

한번 더 수행해보면 결과는 다음과 같습니다.


title_id
--------
BU7832
BU2075
MC3026
PS3333
TC3218

(5개 행 적용됨)

결과가 계속 달라짐을 알 수 있습니다. 확인해 보세요~

3. 정리

참 편리하죠? 만일 위 기능을 추첨에 사용한다고 한다면 한번 추첨된 값은 대상에서 제외하는 처리 루틴을 포함해야 합니다. SELECT 된 결과는 다른 테이블에 기록을 하고 그 테이블에 존재하는 대상을 제외하고 SELECT 되도록 하면 쉽게 해결이 됩니다.

Posted by 퓨전마법사
,