2016-08-27 2 views
4

Мне нужно случайным образом выбирать значения из одной таблицы, например. tableA.a_id, который является VARCHAR2, и используйте значение для вставки в другую таблицу. Например, предполагая, что три колонки должна быть вставлена ​​в 100 строк tableX (порядковый номер, случайное число в диапазоне от 100 до 999, а значения tableA.a_id):Выбор случайной строки в Oracle

insert into tableX 
select 
    rownum, 
    dbms_random.value(100,999), 0), 
    (select a_id from 
    (
     SELECT a_id 
     FROM tableA 
     ORDER BY dbms_random.value 
    ) 
    where rownum = 1) 
from 
    (select level from dual connect by level <= 100); 

Однако вместо того, выбирая случайную строку из tableA.a_id для каждой строки, он выбирает то же значение для всех строк, например:

1 129 A-ID-48 
2 849 A-ID-48 
3 367 A-ID-48 

Однако, если выполнить подчиненный запрос повторно, я получаю новое значение каждый раз (по понятным причинам), например:

select a_id from 
    (
     SELECT a_id 
     FROM tableA 
     ORDER BY dbms_random.value 
    ) 
where rownum = 1; 

Результат будет после каждого выполнения:

A-ID-7 
A-ID-48 
A-ID-74 

Как изменить исходный запрос, или придумать новый по этому вопросу, что бы вставка случайных строк из tableA «s a_id колонке для каждой строки вставки в таблицу назначения? Результат Желание:

1 129 A-ID-7 
2 849 A-ID-48 
3 367 A-ID-74 

Обновление 1

Основываясь на mathguy answer, я обновил запрос для одного выбора таблицы:

insert into tableX 
select 
    rownum, 
    round(dbms_random.value(100,999), 0), 
    a_id 
from 
    (
     select 
     round(dbms_random.value(1, (select count(*) from tableA)), 0) tableX_rand_num 
     from tableX 
    ) x 
join 
    (
     select 
     a_id, 
     dbms_random.value() rnd, 
     rownum tableA_rownum 
     from tableA 
     order by rnd 
    ) a 
on x.tableX_rand_num = a.tableA_rownum 
where rownum <= 100; 

ОГРАНИЧЕНИЕ: количество вставленных строк с помощью этого метод не будет зависеть от числовых записей, доступных в родительской таблице (tableX). Другими словами, вы можете вставлять столько записей, сколько общих строк, доступных в tableX. например если tableX имеет 200 записей, и вы хотите вставить 1000, запрос выше позволит вам вставить до 200 строк.

ответ

5

сделать внутренний запрос:

select a_id, dbms_random.value() rnd from tableA order by rnd 

, а затем во внешнем запросе выберите 100 строк в одном кадре, с rownum <= 100.

Как так:

insert into tableX 
select 
    rownum, 
    round(dbms_random.value(100,999), 0), 
    a_id 
from 
    (
     SELECT a_id, dbms_random.value() rnd 
     FROM tableA 
     ORDER BY rnd 
    ) 
where rownum <= 100; 
+0

Я не совсем следуя вашей логике. Какой внутренний запрос требуется для замены? Не нужно ли 'where rownum = 1' для первого внутреннего запроса вернуть только одну запись? – NuCradle

+0

Было легче добавить полный запрос к ответу. См. Выше. Я добавил обратно раунд ('который вы, кажется, удалили случайно. – mathguy

+0

Я не думаю, что изменения прошли. :) – NuCradle

Смежные вопросы