【问题标题】:Using the sample function in a complex query in PLSQL在 PLSQL 的复杂查询中使用示例函数
【发布时间】:2020-11-03 11:59:24
【问题描述】:

我想从我的查询返回的行中随机选择一个样本。我已经阅读了答案How to get records randomly from the oracle database?,但我无法让 dbms_random.random 工作,所以我尝试了示例函数。

但是当我请求我的值样本时出现错误。一个可重现的例子是: 提供的示例查询只是为了重现性,它们与我的实际用例无关(因为我不想选择 7 行或类似的东西)

select * from (select 1,2,3,4,5,6,7 from dual) sample(0.1)
-- doesn't work
select * from (select 1,2,3,4,5,6,7 from dual)t sample(0.1)
-- doesn't work either

我在这里做错了什么?我的目标是从子查询的结果中随机选择一个样本,但我没有使用dbms_random.value 的权限。

【问题讨论】:

  • 您确定没有dbms_random.value 的权限吗?什么返回 select dbms_random.value() v from dual
  • 您也可以使用((1+mod(ora_hash(sys_guid()),1000))/1000) 代替dbms_random.value()。示例:select ((1+mod(ora_hash(sys_guid()),1000))/1000) rand from dual;

标签: oracle plsql


【解决方案1】:

Oracle 不支持对不保留键的派生表或视图进行采样 (link)。

另外,请注意,如果您想为 Oracle 中的前 7 个整数中的每一个创建 1 行:

select level
from dual
connect by level <= 7

【讨论】:

  • 谢谢!如何使我的查询保留密钥?我正在加入两个表,我尝试选择表的键,但这也不起作用。
  • @User2321 您可以使用临时表:create table x as ... 然后使用sample 从 x 中选择并删除 x
【解决方案2】:

DBMS_RANDOM 中的基本函数 VALUE 获取一个大于等于 0 且小于 1 的随机数,小数点右侧有 38 位(38 位精度)。

或者,当指定下限和上限时,它会检索介于两者之间的随机数。在您的情况下,您可以使用 1 到 7 获得一个随机整数值

select round(dbms_random.value(1,7),0) from dual ;

您甚至可以从您的表格中获取这些值

select round(dbms_random.value(a.min_value,a.max_value),0) from my_table a ;

由于您没有解释您想从表中选择什么,我只能为您提供一个通用的答案。

【讨论】:

  • 我对 dbms_random.value 的问题是,当我尝试使用它时,我得到:“ORA-0094: DBMS_RANDOM.VALUE invalid identifier”
  • 显然您没有 DBMS_RANDOM 的权限。您的 DBA 应该向您的用户授予 EXECUTE 权限。
  • 是的,这需要一些时间来改变这就是我试图解决它的原因。
  • 原来我设法获得了权利,所以我想这是正确的答案!
猜你喜欢
  • 2013-04-14
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多