关于sql:在Oracle中选择随机行

Selecting a Random Row in Oracle

我需要从一张表中随机选择值,例如tableA.a_idVARCHAR2,并使用该值插入到另一个表中。例如,假设需要将三列插入到tableX的100行中(序列号,100和999之间的随机数以及tableA.a_id的值):

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);

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

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

如何更改原始查询,或为此提出一个新查询,该查询将从tableAa_id列中为目标表中的每个插入行插入随机行?期望结果:

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;

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


进行内部查询:

1
SELECT a_id, dbms_random.value() rnd FROM tableA ORDER BY rnd

,然后在外部查询中一键选择100行,并使用rownum <= 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;