2010-02-05 4 views
4

일부 테스트 데이터를 생성하고 dbms_random을 사용 중입니다. 나는 JOIN의 상태에 dbms_random을 사용할 때 설명 할 수없는, 어떤 이상한 행동을 발견 :임의의 값을 조인 조건으로 사용

------------------------# test-data (ids 1 .. 3) 
With x As (
    Select Rownum id From dual 
    Connect By Rownum <= 3 
) 
------------------------# end of test-data 
Select x.id, 
     x2.id id2 
    From x 
    Join x x2 On (x2.id = Floor(dbms_random.value(1, 4))) 


Floor(dbms_random.value(1, 4))가 (1,2,3)에서 임의의 숫자를 반환, 그래서 예상했을 것이다 x의 모든 행은 x2의 임의 행으로 결합되거나, 임의의 숫자가 한 번만 평가되는 경우에는 항상 x2의 동일한 임의의 행이 될 수 있습니다.

여러 번, 그래도, 그런 결과를 얻기를 시도 할 때 :

(1) ID ID2  (2) ID ID2  (3) 
    ---- ----   ---- ----   no rows selected. 
     1 2    1 3 
     1 3    2 3 
     2 2    3 3 
     2 3 
     3 2 
     3 3 

나는 무엇을 놓치고?

편집 :

SELECT ROWNUM, FLOOR(dbms_random.VALUE (1, 4)) 
FROM dual CONNECT BY ROWNUM <= 3 

이 경우에 결과를 얻을 것입니다, 그런데 왜 원래 쿼리가 그렇게 행동 하는가? 하나 개의 예측 값과 하나 개의 임의의 값으로 세 개의 행을 생성하는

답변

1

,이 시도 :

SQL> with x as (
    2 select rownum id from dual 
    3 connect by rownum <= 3 
    4  ) 
    5  , y as (
    6 select floor(dbms_random.value(1, 4)) floor_val 
    7 from dual 
    8  ) 
    9 select x.id, 
10   y.floor_val 
11 from x 
12 cross join y 
13/

     ID FLOOR_VAL 
---------- ---------- 
     1   2 
     2   3 
     3   2 

SQL 

편집

가 왜 원래 쿼리 행의 일관성 집합을 반환 했습니까?

글쎄, ON 절의 무작위 비트가 없으면 쿼리는 기본적으로 X에 대한 X의 크로스 조인이었습니다. 9 개의 행을 반환했을 것입니다 (적어도 구문에서 허용하는 경우). 9 행 각각은 DBMS_RANDOM.VALUE()에 대한 호출을 실행합니다. 무작위 값이 X2.ID의 현재 값과 일치 할 때만 결과 집합에 포함 된 행입니다. 따라서 쿼리는 무작위로 0-9 행을 반환 할 수 있습니다.

귀하의 솔루션을 분명히 간단하다 - 내가 충분히 리팩토링하지 않았다 :)

+0

감사합니다,이보다 쉽게 ​​할 수있는, 내 업데이트 된 질문을 참조하십시오. 내 질문의 결과가 왜 그렇게 이상한 지 궁금 해서요 ... 어떤 생각? –

관련 문제