不明白楼主的意思,是要取几位呢? 6A 、 6AC、 6A1??
怎么样算重复的数据呢?2位还是3位?
如果是固定的位数的话,那么用SUBSTR取固定的长度可好?

解决方案 »

  1.   

    就是按A表的DYQZ的长度优先匹配呀,位数当然不固定呀,越长的越先匹配.
     这样说吧,上面的数据例子中TB表中的6AC000只能与 TA表中的 20 6AC 匹配,而不能与 10 6A匹配.
      

  2.   

    刚才在itpub上也看到了,想了半天还是没出来
    帮你顶一下!
      

  3.   

    SQL> select max(dyqz) from ta where &dy like dyqz||'%';
    输入 dy 的值:  '6AC000'
    原值    1: select max(dyqz) from ta where &dy like dyqz||'%'
    新值    1: select max(dyqz) from ta where '6AC000' like dyqz||'%'MAX(D
    -----
    6ACSQL> select max(dyqz) from ta where &dy like dyqz||'%';
    输入 dy 的值:  '6A0000'
    原值    1: select max(dyqz) from ta where &dy like dyqz||'%'
    新值    1: select max(dyqz) from ta where '6A0000' like dyqz||'%'MAX(D
    -----
    6A
      

  4.   

    ----不知道这样算不算解决问题,我建立了这样的测试环境
    ----
    create table ta((DMQZ varchar2(50),DYQZ varchar2(50)));create table tb((DM varchar2(50),re varchar2(50)));----CREATE OR REPLACE PROCEDURE ERICY
    IS
    CURSOR TESTA IS 
    SELECT * FROM TA
    ORDER BY DYQZ DESC;
    TT TA%ROWTYPE;
    BEGIN
      if TESTA%ISOPEN then close TESTA; end if;
      open TESTA;
      update tb set re = null;
      COMMIT;
      loop
        fetch TESTA into tt;
        exit when TESTA%notfound;
        begin
      UPDATE TB
      SET RE = REPLACE(DM,TT.DYQZ,TT.DMQZ)
      WHERE RE IS NULL
      AND SUBSTR(DM,1,LENGTH(TT.DYQZ))=TT.DYQZ;
      COMMIT;      
        end;
      end loop;
      close TESTA;  
    END;
    /begin
    ericy;
    end;-----re中存放的事结果select re from tb;
    SELECT * FROM TB
    DM                                                 RE                           
    -------------------------------------------------- -----------------------------
    6A0000                                             100000                       
    6AC000                                             20000                        
    6A1111                                             101111                       
    7B0000                                             300000                       
    4 rows selected搞定
    :)
      

  5.   

    谢谢各位,ITPUB.NET上高手帮我解决了
    create table ta(dmqz varchar2(10),dyqz varchar2(10)); 
    create table tb(dm varchar2(20)); 
    insert into ta values('10','6A'); 
    insert into ta values('210','6AC'); 
    insert into ta values('30','7B'); insert into tb values('6A0000'); 
    insert into tb values('6A1111'); 
    insert into tb values('7B0000'); 
    commit; select dmqz || substr(dm,length(dyqz)+1) 
    from ( 
    select ta.dmqz,ta.dyqz,tb.dm, 
    dense_rank() over (partition by tb.dm order by ta.dyqz desc) rn 
    from ta,tb where instr(dm,dyqz) > 0 
    ) where rn = 1;
      

  6.   

    create function get_dm(p_dyqz in varchar2)
    return varchar2
    as
    str varchar2(10):='0';
    cursor t_sor is
    select dm from tb where instr(dm,p_dyqz)>0;
    begin
    for v_sor in t_sor loop
    if substr(v_sor.dm,1,length(p_dyqz))=p_dyqz then
     if substr(v_sor.dm,length(p_dyqz)-length(v_sor.dm))-str=0 then
      return substr(v_sor.dm,length(p_dyqz)-length(v_sor.dm));
     end if;
    end if;
    end loop;
    end;
    /
    SELECT dmqz||get_dm(dyqz) from ta;