Мне нужно случайным образом выбирать значения из одной таблицы, например. 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 строк.
Я не совсем следуя вашей логике. Какой внутренний запрос требуется для замены? Не нужно ли 'where rownum = 1' для первого внутреннего запроса вернуть только одну запись? – NuCradle
Было легче добавить полный запрос к ответу. См. Выше. Я добавил обратно раунд ('который вы, кажется, удалили случайно. – mathguy
Я не думаю, что изменения прошли. :) – NuCradle