在PLSQL中使用复杂查询中的sample函数

11 浏览
0 Comments

在PLSQL中使用复杂查询中的sample函数

我想从我的查询结果中选择一个随机样本。我已经阅读了这个答案How to get records randomly from the oracle database?,但是我无法使dbms_random.random工作,所以我尝试了sample函数。但是当我请求一个样本时,我遇到了错误。一个可以重现的示例如下:

提供的示例查询只是为了可重现性,与我的实际用例无关(即我不想选择7行或类似的内容)

select * from (select 1,2,3,4,5,6,7 from dual) sample(0.1)
--不起作用
select * from (select 1,2,3,4,5,6,7 from dual)t sample(0.1)
--也不起作用

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

0
0 Comments

问题出现的原因是用户没有对DBMS_RANDOM.VALUE函数的执行权限。解决方法是由数据库管理员授予用户执行该函数的权限。用户可以尝试通过以下查询来获取随机整数值:

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

如果用户无法获取权限,可以尝试使用其他方法来解决问题。在这种情况下,用户可以尝试使用其他随机数生成函数或算法来生成所需的随机数。

0
0 Comments

在PLSQL中使用复杂查询的时候,有一个常见的问题是Oracle不支持对派生表或不保留键的视图进行抽样。这意味着无法在这些情况下使用sample函数来进行抽样操作。这个限制在Oracle的官方文档中有详细说明。

另外,如果你想在Oracle中为前7个整数创建1行记录,可以使用以下查询语句:

select level
from dual
connect by level <= 7

当遇到无法使用sample函数进行抽样的情况时,有一个解决方法是创建一个临时表,然后在这个表上使用sample函数进行抽样操作,最后再删除这个临时表。具体操作如下:

create table x as ...
select * from x sample(10);
drop table x;

通过创建临时表x,我们可以在这个表上使用sample函数进行抽样操作。然后,我们可以从这个临时表中查询所需的数据,并使用sample函数指定抽样的比例。最后,通过drop table语句删除这个临时表,以避免对数据库的影响。

总结起来,当在PLSQL中遇到无法使用sample函数进行抽样的情况时,可以通过创建临时表来解决这个问题。这种方法可以绕过Oracle对派生表和不保留键的视图的抽样限制,从而实现所需的抽样操作。

0