有个表为agreement,现在要求的它的id字段(数值是3223至21947)对应counterpartyid(另外一个表的主键),而counterpartyid有固定的两段:第一段是从2846至3079,第二段是2353至2611,数据库为oracle,怎么写sql让id字段轮番对应两段counterpartyid,因为counterpartyid不够,所以两端对应完了可以重新从第一段开始,然后第二段,直到把agreementid对应完。直接写sql能解决么?

解决方案 »

  1.   

    如果counterpartyid表的主键是连续的就简单多了,如果是非连续的就需要先取出存在的主键值,然后再对应更新,就稍微麻烦点。给你个连续键值更新的方法:
    DECLARE
      L_C INT := 2353;
      L_D INT := 2611;
      L_A INT := 2846;
      L_B INT := 3079;
      L_E INT := 0;
      CURSOR L_Cur IS
        SELECT ID
          FROM AGREEMENT
         WHERE ID >= 3223
           AND ID <= 21947;
    BEGIN
      L_E := L_C;
      FOR I IN L_Cur LOOP
        IF L_E BETWEEN L_C AND L_D THEN
           UPDATE agreement  SET ID=l_e WHERE ID=i.id;
          --DBMS_OUTPUT.PUT_LINE(L_E);
          L_E := L_E + 1;
        ELSIF L_E BETWEEN L_A AND L_B THEN
          UPDATE agreement  SET ID=l_e WHERE ID=i.id;
          --DBMS_OUTPUT.PUT_LINE(L_E);
          L_E := L_E + 1;
        ELSIF L_E > L_D AND L_E < L_A THEN
          L_E := L_A;
        ELSIF L_E > 3079 THEN
          L_E := L_C;
        END IF;
      END LOOP;
    END;
    /
      

  2.   

     简单些吧 agreement(id,counterpartyid),当id=3230时,counterpartyid=2846,....id=3463,counterpartyid=3079,这时候第一段counterpartyid用完了,所以id=3464时,counterpartyid=2353......id=3722,counterpartyid=2611,第二段也用完了,id=3723,counterpartyid=2846,重新利用第一段的counterpartyid。
    如果counterpartyid是连续的并且和id一起增长,那就好办了,直接update,id和counterpartyid有固定差值。但现在counterpartyid分为两段并且有限。问能否直接用sql在数据库中添加与id对应的counterpartyid数字值(范围只能在两端中)。
      

  3.   

    oracledbalgtu,谢谢你啊,看了一遍,感激。我运行时改了字段
    DECLARE
      L_C INT := 2353;
      L_D INT := 2611;
      L_A INT := 2846;
      L_B INT := 3079;
      L_E INT := 0;
      CURSOR L_Cur IS
        SELECT ID
          FROM COLAGREEMENTHEADER
         WHERE ID >= 3223
           AND ID <= 21947;
    BEGIN
      L_E := L_C;
      FOR I IN L_Cur LOOP
        IF L_E BETWEEN L_C AND L_D THEN
           UPDATE COLAGREEMENTHEADER  SET COUNTERPARTYHQ=l_e WHERE ID=i.id;
          --DBMS_OUTPUT.PUT_LINE(L_E);
          L_E := L_E + 1;
        ELSIF L_E BETWEEN L_A AND L_B THEN
          UPDATE COLAGREEMENTHEADER  SET COUNTERPARTYHQ=l_e WHERE ID=i.id;
          --DBMS_OUTPUT.PUT_LINE(L_E);
          L_E := L_E + 1;
        ELSIF L_E > L_D AND L_E < L_A THEN
          L_E := L_A;
        ELSIF L_E > 3079 THEN
          L_E := L_C;
        END IF;
      END LOOP;
    END;
    查看结果时每到两者交换的地方,插入的不是两者范围的,如id为3643时对应840,3903时为1045,4318时1238,4398时1008,好像是我原来的值,就是当le不在两段时sql中只写了l_e在两者间转换。而ID是增加过的但counterpartyhq没被修改。l_e转换后直接进了下一个for循环。但是如果我修改下counterpartyhq的值,并且把le++就可以了吧。明天在试了。