Мне нужно случайным образом выбрать значения из одной таблицы, например. tableA.a_id
, который является VARCHAR2
, и используйте это значение для вставки в другую таблицу. Например, предположим, что необходимо вставить три столбца в 100 строк tableX
(порядковый номер, случайное число от 100 до 999 и значения tableA.a_id
):
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
Как мне изменить исходный запрос или придумать новый, если на то пошло, который будет вставлять случайные строки из столбца a_id
tableA
для каждой вставляемой строки в целевую таблицу? Желаемый результат:
1 129 A-ID-7
2 849 A-ID-48
3 367 A-ID-74
Обновление 1
Основываясь на ответе mathguy, я обновил запрос для выбора одной таблицы:
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 строк.