Sql 一行的随机记录

Sql 一行的随机记录,sql,oracle,random,Sql,Oracle,Random,我有下表,其中包含数据。我希望从strval表中随机选择2行,并在循环中填充表S1 我想要这样的东西 Create table s1(id primary key,strval1, strval2) as select level,random_rec(strvals), random_rec(strvals) from dual connect by level<=10; 无效 1, 'AAAA', 'AAAA' Create table strvals(

我有下表,其中包含数据。我希望从strval表中随机选择2行,并在循环中填充表S1

我想要这样的东西

Create table s1(id primary key,strval1, strval2) as 
   select level,random_rec(strvals), random_rec(strvals) 
   from dual 
   connect by level<=10;
无效

1, 'AAAA', 'AAAA'

Create table strvals(
  strval varchar2(4),
  constraint pk_strval primary key (strval)   
);

insert into strvals 
values(  
 'AAAA'   
);

insert into strvals 
values(  
 'BBBB'   
);

insert into strvals 
values(  
 'CCCC'   
);

从表中获取随机字符串可能很棘手。一种方法是使用相关子查询-correlation子句确保子查询不会优化为只运行一次

因此,这里有一种方法:

select id, strval,
       (select s2.strval
        from strvals s2
        where s2.strval <> x.strval and x.id > 0
        order by dbms_random.random fetch first 1 row only
       ) as strval2
from (select id,
             (select strval
              from strvals
              where x.id > 0
              order by dbms_random.random fetch first 1 row only
             ) as strval
     from (select level as id
           from dual 
           connect by level < 25
          ) x
    ) x;

和是一个dbfiddle。

要减少许多行中的慢速dbms_random.value,我建议使用以下技术:

具有 rand as按dbms选择行\u numberroverder\u random.n值,strval from strvals ,cnt作为从兰德选择计数*m
,生成器为select level id,ceildbms_random.value*cnt.m rnd从cnt connect by level谢谢我点击了代码标签,并认为这将格式化代码。我是否需要或[]标签进行格式化谢谢您的回复和专业知识。我的要求是有两个字符串作为输出的一部分,即1,'AAAA','BBBB'2,'CCCC','BBBB'3,'CCCC','AAAA'ah,好的,完成-请查看更新的答案,抱歉,我错过了另一个要求-有不同的字符串。。。不确定我的方法是否有效…@Beefstu好的,用2个strval完成。请查看最新更新,了解您的帮助和雄辩的解决方案。希望我能自己承担剩下的事情。太好了!!谢谢你的帮助和帮助expertise@Beefstu . . . 如果这回答了你的问题,你可以接受答案。谢谢你的评论,但你甚至没有对答案投赞成票:所以请向我投赞成票
select id, strval,
       (select s2.strval
        from strvals s2
        where s2.strval <> x.strval and x.id > 0
        order by dbms_random.random fetch first 1 row only
       ) as strval2
from (select id,
             (select strval
              from strvals
              where x.id > 0
              order by dbms_random.random fetch first 1 row only
             ) as strval
     from (select level as id
           from dual 
           connect by level < 25
          ) x
    ) x;