Sql 仅使用select生成随机列表

Sql 仅使用select生成随机列表,sql,oracle,Sql,Oracle,我有以下代码: create table test ( name varchar2(20 byte) ); insert into test values ('Fred'); insert into test values ('Wilma'); insert into test values ('Betty'); insert into test values ('Barny'); commit; select * from test order by dbms_random.ra

我有以下代码:

create table test 
(
  name varchar2(20 byte) 
);

insert into test values ('Fred');
insert into test values ('Wilma');
insert into test values ('Betty');
insert into test values ('Barny');

commit;

select * from test order by dbms_random.random;

当然,在本例中,select语句将创建一个包含4个条目的随机列表。是否有一种方法可以更改select语句,以便在不使用PL的情况下将列表扩展到4个或4个以下的条目?

您可以使用自交叉连接来平方可用的行数,对结果进行随机排序,并获得前X行;假设X小于行数的平方,例如,对于四个源行,交叉连接有16个结果,在本例中,X为10,则您可以得到所需的结果:

select * from (
  select t1.name from test t1
  cross join test t2
  order by dbms_random.value
)
where rownum <= 10;

NAME                
--------------------
Betty
Betty
Fred
Betty
Wilma
Betty
Fred
Wilma
Barny
Barny

10 rows selected. 

内部查询现在只获取级别<10限制的36行。您将需要使用实际数据量进行测试,并针对合理的结果和性能进行调整。

您可以使用自交叉连接来计算可用行数的平方,随机排序结果,并获得前X行;假设X小于行数的平方,例如,对于四个源行,交叉连接有16个结果,在本例中,X为10,则您可以得到所需的结果:

select * from (
  select t1.name from test t1
  cross join test t2
  order by dbms_random.value
)
where rownum <= 10;

NAME                
--------------------
Betty
Betty
Fred
Betty
Wilma
Betty
Fred
Wilma
Barny
Barny

10 rows selected. 

内部查询现在只获取级别<10限制的36行。您需要使用实际数据量进行测试,并根据合理的结果和性能进行调整。

是否要从表test中选择X倍随机行?是-从表test中检索包含随机行的X行选择t.*从测试t,按级别从双连接中选择rownum rn是否要从表测试中选择X倍随机行?是-从表测试中检索包含随机行的X行选择t.*从测试t中,按级别从双连接中选择rownum rn
select * from (
  select * from test
  connect by level < 10
  and prior name = name
  and prior dbms_random.value is not null
  order by dbms_random.value
)
where rownum <= 10;