Selecting a Random Row in Oracle
我需要从一张表中随机选择值,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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); |
但是,它不是从
1 2 3 | 1 129 A-ID-48 2 849 A-ID-48 3 367 A-ID-48 |
但是,如果我重复执行子查询,则每次(出于明显的原因)都会得到一个新值,例如:
1 2 3 4 5 6 7 | SELECT a_id FROM ( SELECT a_id FROM tableA ORDER BY dbms_random.value ) WHERE rownum = 1; |
结果将在每次执行之后:
1 2 3 | A-ID-7 A-ID-48 A-ID-74 |
如何更改原始查询,或为此提出一个新查询,该查询将从
1 2 3 | 1 129 A-ID-7 2 849 A-ID-48 3 367 A-ID-74 |
更新1
基于mathguy答案,我为单个表选择更新了查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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; |
限制:使用此方法插入的行数将与父表(
进行内部查询:
1 | SELECT a_id, dbms_random.value() rnd FROM tableA ORDER BY rnd |
,然后在外部查询中一键选择100行,并使用
例如:
1 2 3 4 5 6 7 8 9 10 11 12 | 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; |