2014-09-15 6 views
0

특정 조건을 만족하는 행 x 개를 임의로 선택해야하고 다른 기준을 충족하는 행 번호 x 개를 무작위로 선택해야하는 데이터 세트가 하나의 테이블에 모두 출력됩니다.무작위 행과 중복으로 중복 방지

SELECT * FROM (SELECT TOP 1000 * FROM dbo.[Client List] 
WHERE Source = 'HC' AND Service = 'Service1' AND Provider = 'ProviderName1' 
ORDER BY NEWID()) Table1 

UNION ALL 

SELECT * FROM (SELECT TOP 500 * FROM dbo.[Client List] 
WHERE Source = 'HC' AND Service = 'Service2' AND Provider = 'ProviderName2' 
ORDER BY NEWID()) Table2 

UNION ALL 

SELECT * FROM (SELECT TOP 2200 * FROM dbo.[Client List] 
WHERE Source = 'BA' AND Service = 'Service3' AND Provider = 'ProviderName3' 
ORDER BY NEWID()) Table3 

이 작동하지만 한 가지 문제가있다 :... 그것은 클라이언트 식별자 (DBO [클라이언트리스트] [된 ClientID]의 중복을 허용하는 것 선택할 수 내 모든 결과는 반드시 내가이 다음 사용하고

즉, 첫 번째 임의 선택을 수행 한 다음 첫 번째 선택에서 선택한 ClientID를 선택하지 않고 두 번째 임의 선택을 수행해야합니다. (예, 알고 있습니다. 이것은 기술적으로 "무작위"가 아닙니다.) 각각의 후속 SELECT의 WHERE 문에 일종의 코드를 추가 할 수있는 방법이 있습니까? 아니면 코드의 전체 구조를 다시 생각해야합니까? 고마워요!

답변

0

어때?

with Service1 as 
(
    SELECT TOP 1000 * 
    FROM dbo.[Client List] 
    WHERE Source = 'HC' 
     AND Service = 'Service1' 
     AND Provider = 'ProviderName1' 
    ORDER BY NEWID() 
) 
, Service2 as 
(
    SELECT TOP 500 * 
    FROM dbo.[Client List] 
    WHERE Source = 'HC' 
     AND Service = 'Service2' 
     AND Provider = 'ProviderName2' 
     AND ClientID not in (select ClientID from Service1) 
    ORDER BY NEWID() 
) 
, Service3 as 
(
    SELECT TOP 2200 * 
    FROM dbo.[Client List] 
    WHERE Source = 'BA' 
     AND Service = 'Service3' 
     AND Provider = 'ProviderName3' 
     AND ClientID not in (select ClientID from Service1) 
     AND ClientID not in (select ClientID from Service2) 
    ORDER BY NEWID() 
) 

select * 
from Service1 

union all 

select * 
from Service2 

union all 

select * 
from Service3