首页 > 数据库技术 > 详细

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

时间:2015-06-03 02:09:42      阅读:1362      评论:0      收藏:0      [点我收藏+]

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


bubuko.com,布布扣
?

? ? ? ? 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;

?

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

?

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


bubuko.com,布布扣
?

? ? ? ? A1:执行SQL,取得列idORIGINAL_VALUE

? ? ? ? A2:打乱A1的次序。

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


bubuko.com,布布扣
?

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


bubuko.com,布布扣
?

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

原文:http://datamachine.iteye.com/blog/2216051

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!