在Oracle中选择随机行

NuC*_*dle 4 sql oracle random insertion

我需要从一个表中随机选择值,例如tableA.a_ida 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);
Run Code Online (Sandbox Code Playgroud)

但是,不是从tableA.a_id每行中选择一个随机行,而是为所有行选择相同的值,例如:

1 129 A-ID-48
2 849 A-ID-48
3 367 A-ID-48
Run Code Online (Sandbox Code Playgroud)

但是,如果我重复执行子查询,每次都会得到一个新值(原因很明显),例如:

select a_id from 
    (
      SELECT a_id 
      FROM tableA
      ORDER BY dbms_random.value
    )
where rownum = 1;
Run Code Online (Sandbox Code Playgroud)

结果将在每次执行后:

A-ID-7
A-ID-48
A-ID-74
Run Code Online (Sandbox Code Playgroud)

如何改变原来的查询,或拿出一个新的对于这个问题,这将来自随机行中插入tableAa_id每个插入行的目标表列?欲望结果:

1 129 A-ID-7
2 849 A-ID-48
3 367 A-ID-74
Run Code Online (Sandbox Code Playgroud)

更新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;
Run Code Online (Sandbox Code Playgroud)

限制:使用此方法插入的行数不会与父表(tableX)中可用的数字记录无关.换句话说,您只能插入与可用总行数一样多的记录tableX.例如,如果tableX有200条记录,并且您希望插入1000条,则上述查询只允许您插入最多200行.

mat*_*guy 5

进行内部查询:

select a_id, dbms_random.value() rnd from tableA order by rnd
Run Code Online (Sandbox Code Playgroud)

然后在外部查询中一次选择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;
Run Code Online (Sandbox Code Playgroud)