sql - 为什么 dbms_random.value 在图形查询(连接依据)中返回相同的值?

标签 sql oracle random

在 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/

相关文章:

oracle - sqlplus 从假脱机中删除\r\n\t

sql - IN 子句如何影响 oracle 中的性能?

sql - 可怕的 Oracle 更新性能

c++ - 在 POSIX 上生成随机 double 的最佳方法是什么?

php - MySQL 将随机行从一个表移动到另一个表

php - 如何在 PHP 中获取长 19 位随机数?

mysql - 从内部联接内的子查询访问表 - MySql

sql - 如何正确构造此 sql 查询?

sql - 如何按列和下一行排序并按另一列排序?

sql - 获取两个日期之间每个月的开始和结束时间