我是新人,现有一坨数据,日期都是‘20110118’,为了测试 我想把这坨数据平均分成3个部分,分别对应日期‘20110116’,‘20110117’和‘20110118’。于是我这样做:update ods_hx_bill_pact_rel 
set data_date = '20110116'
where rownum between 0 and (select count(*) from ods_hx_bill_pact_rel)/3;
update ods_hx_bill_pact_rel 
set data_date = '20110117'
where rownum between (select count(*) from ods_hx_bill_pact_rel)/3 and (select count(*) from ods_hx_bill_pact_rel)*2/3;
但是每次执行之后,也提交了,之后查询发现只有前三分之一的数据被改成了‘20110116’,最后的三分之一的‘20110118’不变,中间的三分之一还是‘20110118’,没有变成‘20110117’,为什么呀?

解决方案 »

  1.   

    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
    是指查询出来之后再分配行号,所以不适于between,如果用between查出来可能不是你想要的结果这样
    update ods_hx_bill_pact_rel 
    set data_date = '20110116'+ mod(rownum,3);
      

  2.   


    -----------------------------------谢谢你的解释,我可以解决当前问题了,但是刚才又发现一个这样的问题:
    这坨数据有8000多行  我这样用:
     select data_date from ods_hx_bill_pact_rel where rownum between 2000 and 4000结果也是一条记录也没有,这是怎么呢,
     select data_date from ods_hx_bill_pact_rel where rownum between 0 and 4000这样却可以,为什么呀?
      

  3.   

    我是这样做的:
    update ods_hx_bill_pact_rel set data_date = '20110116' and rownum<(select count(*) from ods_hx_bill_pact_rel)/3+1;
    update ods_hx_bill_pact_rel set data_date = '20110117' and rownum<(select count(*) from ods_hx_bill_pact_rel)/3+1;
    update ods_hx_bill_pact_rel set data_date = '20110118' and rownum<(select count(*) from ods_hx_bill_pact_rel)/3+1;
      

  4.   

    rownum不能直接between 2000 and 4000吧?
    他只能从1开始往后生成
    没有1 就查不到2000 所以是空的
    rownum不是静态的 而是每查一条数据动态生成一个 所以 必须从1开始 不能搞空中楼阁
      

  5.   

    rownum总是从1开始的,所以只能用<,<=
      

  6.   

    用between 也可以 但必须保证从1开始
      

  7.   


     select data_date from (select rownum rn, data_date from ods_hx_bill_pact_rel) 
      where rn between 2000 and 4000;
      

  8.   

    只能使用rownum时,必须从1开始。
    另一种方式是做子查询,把rownum作为一个字段记录下来再使用
      

  9.   

    例如子查询 select rownum,data_date from(select rownum as rn from tables where rownum<4000) rownum>=2000;
    记住必须先取<=等的区间,然后再在此区间去取。
      

  10.   

    第2个问题很第1个问题犯得是同样的错误,rownum是一个伪列,它会根据返回记录生成一个序列化的数字,其必须要有返回结果后,每条返回记录会对应产生一个rownum数值,这个数值是从1开始排序的
    应该是:
    select data_date from ods_hx_bill_pact_rel where rownum <= 4000
    minus
    select data_date from ods_hx_bill_pact_rel where rownum <=2000;