2010-02-05 16 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的一個CROSS JOIN - 它將返回九行(至少在語法允許的情況下它會有)。這9行中的每一行都執行對DBMS_RANDOM.VALUE()的調用。只有當隨機值與X2.ID的當前值匹配時,纔是結果集中包含的行。因此查詢可以隨機返回0-9行。

您的解決方案顯然是簡單的 - 我沒有足夠的重構:)

+0

謝謝,可以這樣做更容易,看到我更新的問題。我想知道爲什麼我的查詢結果是如此奇怪,雖然......任何想法? – 2010-02-05 12:31:34