在 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
我该如何更改原始查询,或者为此想出一个新的查询,即从 tableA
的 a_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;
我需要从一个 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
我该如何更改原始查询,或者为此想出一个新的查询,即从 tableA
的 a_id
列中为每个插入行插入随机行目的地 table?期望结果:
1 129 A-ID-7
2 849 A-ID-48
3 367 A-ID-74
更新 1
基于
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;