Использование случайного значения в качестве условия соединения - PullRequest
4 голосов
/ 05 февраля 2010

Я генерирую некоторые тестовые данные и использую dbms_random. При использовании dbms_random в состоянии JOIN я столкнулся со странным поведением, которое я не могу объяснить:

------------------------# 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

Чего мне не хватает?

EDIT

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

получит результат в этом случае, но почему исходный запрос ведет себя так?

1 Ответ

1 голос
/ 05 февраля 2010

Чтобы сгенерировать три строки с одним прогнозируемым значением и одним случайным значением, попробуйте следующее:

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 ваш запрос был бы в основном CROSS JOIN X против X - он бы возвратил девять строк (по крайней мере, если бы синтаксис позволил это). Каждая из этих девяти строк выполняет вызов DBMS_RANDOM.VALUE(). Только когда случайное значение соответствует текущему значению X2.ID, строка включается в набор результатов. Следовательно, запрос может возвращать 0-9 строк в произвольном порядке.

Ваше решение, очевидно, проще - я недостаточно рефакторинг:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...