oracle 打乱排序,简单化SQL计算之打乱数据列次序(Shuffle)

REF_VALUES是数据库表,ID是主键,ORIGINAL_VALUE是源列,将ORIGINAL_VALUE打乱次序后要更新到空列SHUFFLED_VALUE。部分数据如下:

1554331058.jpg

SQL:

不同的数据库写法不同,以Oracle为例:

create or replace procedure shuffle as

TYPE My_CurType IS REF CURSOR;

CUR_1 My_CurType;

V_id NUMBER(10,0);

V_result varchar2(20);

v_sql varchar2(2000);

begin

OPEN CUR_1 FOR select t1.id,t2.result from (

select rownum rn,id,ORIGINAL_VALUE from REF_VALUES order by ORIGINAL_VALUE) t1

join(

select rownum rn,result from(

select ORIGINAL_VALUE result from REF_VALUES order by dbms_random.value()))t2

on t2.rn=t1.rn;

LOOP

fetch CUR_1 INTO V_id,V_result ;

EXIT WHEN CUR_1%NOTFOUND;

v_sql:='update REF_VALUES set SHUFFLED_VALUE='''||V_result||''' where id='||V_id;

EXECUTE immediate v_sql;

END LOOP;

CLOSE CUR_1;

end shuffle;

计算出打乱次序的结果就需要多层嵌套子查询(前半部分),要再更新到表中还需要用游标(或者用临时表)及存储过程,整个代码非常繁琐。

使用集算器可以避免复杂的嵌套子查询,且可通用于各种数据库,代码如下:

1554331059.jpg

A1:执行SQL,取得列id、ORIGINAL_VALUE。

A2:打乱A1的次序。

A3:将A1中的id列和A2中的ORIGINAL列拼成一个二维表。计算结果如下:

1554331060.jpg

A4:用A3更新表REF_VALUES。选项@u表示只生成更新语句。更新后REF_VALUES如下:

1554331061.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值