在 Oracle 中选择一个随机行

Selecting a Random Row in Oracle

我需要从一个 table 中随机 select 个值,例如tableA.a_id 这是一个 VARCHAR2,并使用该值插入另一个 table。例如,假设需要在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 中为每一行选择随机行,而是 select 所有行的值相同,例如:

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

我该如何更改原始查询,或者为此想出一个新的查询,即从 tableAa_id 列中为每个插入行插入随机行目的地 table?期望结果:

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

更新 1

基于 ,我更新了单个 table selection 的查询:

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;

限制:使用此方法插入的行数不会独立于父项中可用的记录数 table (tableX) .换句话说,您只能插入与 tableX 中可用的总行数一样多的记录。例如如果 tableX 有 200 条记录,而您希望插入 1000 条,则上面的查询最多只能插入 200 行。

进行内部查询:

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

然后在外部查询中 select 一次 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;