回答

收藏

在Oracle选择随机行

技术问答 技术问答 349 人阅读 | 0 人回复 | 2023-09-13

例如,我需要从表中随机选择值tableA.a_ida
+ X5 b# t4 @1 a* iVARCHAR2.然后用这个值插入另一个表。例如,假设需要将三列插入100行tableX(一个序号,一个介于100和999之间的随机数和值tableA.a_id):
$ h0 b2 e; _1 i$ _% ^* \insert into tableXselect    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 但是,与其tableA.a_id为每行选择一个随机行,不如为所有行选择相同的值,例如:
# H! W0 q/ a. P5 f, ^7 w$ K3 @1 129 A-ID-482 849 A-ID-483 367 A-ID-48但是,如果我重复执行子查询,每次( 出于明显的原因    )会得到一个新的值,比如:1 v/ O: }4 I# Y6 q* j
select a_id from  SELECT a_id       FROM tableA      ORDER BY dbms_random.value    )where rownum = 1;每次执行后结果:
0 x, j; b: P6 M2 L; b9 ?A-ID-7A-ID-48A-ID-74如何更改原始查询,或为此提出新的查询,查询将tableA的a_id列中的随机行插入目标表?预期结果:1 R3 v9 D0 t/ A) y0 y
1 129 A-ID-72 849 A-ID-483 367 A-ID-74更新1
, {, n- K6 p% b$ ]$ h- ]- `9 G基于mathguy的答案,我为单个表选择更新了查询:6 s% Y+ ^! k" t9 C
insert into tableXselect    rownum,   round(dbms_random.value(100,999),0)a_idfrom    (     select         round(dbms_random.value(1,(select count(*) from tableA)),0) tableX_rand_num      from tableX   ) xjoin     (     select        a_id,        dbms_random.value() rnd,       rownum tableA_rownum      from tableA      order by rnd   ) aon x.tableX_rand_num = a.tableA_rownumwhere rownum 限制' t. E  Q7 r- P- \
:用这种方法插入的行数将不依赖于父表(tableX)可用的记录数。换句话说,你最多只能插入与可用总行数相同的记录tableX。例如,如果tableX有200条记录,如果您想插入1000条记录,上述查询最多只允许您插入200行。$ R5 ?3 @" p/ r4 E* L/ l  f" [; q3 _  L3 k
                                                                5 X9 I9 h- ?$ _1 O, S7 x0 q4 D/ ~4 P
    解决方案:                                                                1 S  V9 z( w+ b4 s) o6 P# F2 n
                                                                内部查询:4 j5 Q( `4 ?8 o1 M1 O- D9 T5 e1 X
select a_id,dbms_random.value() rnd from tableA order by rnd然后在外部查询中选择100行,一次使用rownum & Y" j" q) k8 E. `3 P( r
像这样:
9 o! t; c8 n$ J# P4 J, S4 hinsert into tableXselect    rownum,   round(dbms_random.value(100,999),0)a_idfrom    (     SELECT a_id,dbms_random.value() rnd      FROM tableA      ORDER BY rnd    )where rownum <=
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则