在 Oracle 11.2.0.4.0 上,当我运行以下查询时,每一行都会得到不同的结果:
select r.n from (
select trunc(dbms_random.value(1, 100)) n from dual
) r
connect by level < 100; -- returns random values
但是只要我在连接或子查询中使用获得的随机值,每一行就会从 dbms_random.value
中获得相同的值:
select r.n, (select r.n from dual) from (
select trunc(dbms_random.value(1, 100)) n from dual
) r
connect by level < 100; -- returns the same value each time
是否可以让第二个查询为每一行返回随机值?
更新
我的例子可能过于简单了,这就是我想要做的:
with reservations(val) as (
select 1 from dual union all
select 3 from dual union all
select 4 from dual union all
select 5 from dual union all
select 8 from dual
)
select * from (
select rnd.val, CONNECT_BY_ISLEAF leaf from (
select trunc(dbms_random.value(1, 10)) val from dual
) rnd
left outer join reservations res on res.val = rnd.val
connect by res.val is not null
)
where leaf = 1;
但是预留可以从 1 到 1.000.000.000(以及更多)。
有时该查询会正确返回(如果它立即选择一个没有保留的随机值)或给出内存不足错误,因为它总是尝试使用相同的 dbms_random.value
值。
最佳答案
您的评论“......我想避免并发问题”让我思考。
为什么不尝试插入一个随机数,注意重复违规,然后重试直到成功?即使是查找可用数字的非常聪明的解决方案也可能在两个单独的 session 中得出相同的新数字。因此,只有插入并提交的预订号码是安全的。
关于sql - 为什么 dbms_random.value 在图形查询(连接依据)中返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51260859/