【发布时间】:2017-01-03 17:29:08
【问题描述】:
我需要从一个表中随机选择值,例如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
如何更改原始查询,或者为此提出一个新查询,将每个插入行从tableA 的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 行。
【问题讨论】:
标签: sql oracle random insertion