自己写了一个,但是比较复杂,还请各位大哥指点一下
有A表和B表,A表是数据表,B表是配置表
A表结构如下             而B表结构如下a  b                 a       b
2  234567            1      234
3  3456456           2      3456
4  34556456          3      3455
5  34534545          4      65546
……                    ……结果就是需要找到A.b中开头与 B.b开头一样的数据,然后将A.a=B.a具体来说就是假如 substr(A.b,1,3)=234,则A.a=1
           假如substr(A.b,1,4)=3456,则A.a=2其中B.b所有项都是唯一的
B.a也是唯一的A表的数据量较大,请教各位该怎么写这个update 语句啊
存储过程也可以,但是尽量简约,谢谢拉

解决方案 »

  1.   

    试试这个:update A
       set A.a = (select B.a from B where substr(A.b, 1, length(B.b)) = B.b)
     where exists (select 1 from B where substr(A.b, 1, length(B.b)) = B.b)
      

  2.   


    SQL> select * from A;A          B
    ---------- --------------------
    2          23456
    3          3456456SQL> select * from B;A          B
    ---------- --------------------
    1          234
    2          3456SQL> update A tableA set tableA.a = (select B.a from B where substr(tableA.b,1,length(B.b)) = B.b)
      2  where exists (
      3     select 1 from B where substr(tableA.b,1,length(B.b)) = B.b
      4  );2 rows updated.SQL> select * from A;A          B
    ---------- --------------------
    1          23456
    2          3456456SQL> 
      

  3.   

    UPDATE A
    SET A.A=(SELECT nvl(B.A,a.a) FROM B WHERE A.B LIKE B.B||'%')
    WHERE EXISTS(SELECT 1 FROM b WHERE A.B LIKE B.B||'%' )
      

  4.   

    NVL可以去掉不用了~UPDATE A
    SET A.A=(SELECT B.A FROM B WHERE A.B LIKE B.B||'%')
    WHERE EXISTS(SELECT 1 FROM b WHERE A.B LIKE B.B||'%' )
      

  5.   

    如按楼主所说,则实现起来要有条件,比如:A.b中开头与 B.b开头一样的数据是否唯一对应,A.a,A.b是否也是唯一的?如不是唯一对应,则可能会造成对A表的同一条记录更改N次,且sql是无法实现的,只能调用存储过程。如是唯一对应,则可参考下下面的sql
    update A
    set A.a=(select B.a where instr(ltrim(rtrim(A.b)),ltrim(rtrim(B.b)),1,1)=1)
    where A.b in (select A.b where instr(ltrim(rtrim(A.b)),ltrim(rtrim(B.b)),1,1)=1)
      

  6.   

    更正一下,去掉去空格函数
    如按楼主所说,则实现起来要有条件,比如:A.b中开头与 B.b开头一样的数据是否唯一对应,A.a,A.b是否也是唯一的?如不是唯一对应,则可能会造成对A表的同一条记录更改N次,且sql是无法实现的,只能调用存储过程。如是唯一对应,则可参考下下面的sql 
    update A 
    set A.a=(select B.a where instr(A.b,B.b,1,1)=1) 
    where A.b in (select A.b where instr(A.b,B.b,1,1)=1)
      

  7.   

    回楼上,A.b中开头与 B.b开头一样的数据不唯一,例如A.b可能有很多条记录与一条B.b对应,而A.a,A.b也非唯一,为什么会出现对A表的同一条记录更改N次的情况?请解释下?我先去6万多条记录做了次试验,更新结果也是6万多次,但是不记得记录与更新结果次数是否一致
      

  8.   

    N次更改的情况不会发生,但是会报错~~SELECT * FROM A
            A       B
    1 234567
    2 3456456
    3 34556456
    1 34534545
    ---------------------
    --注意B为2345,234的那两条记录
    SELECT * FROM B
            A       B
    5 2345
    1 234
    2 3456
    3 3455
    4 65546
    --------
    --执行我的更新语句
    --执行你们2个的也一样~
    UPDATE A
    SET A.A=(SELECT nvl(B.A,a.a) FROM B WHERE A.B LIKE B.B||'%')
    WHERE EXISTS(SELECT 1 FROM b WHERE A.B LIKE B.B||'%' )
    --报错为单行子查询返回多个值
    --归根结底的问题就是表A中的23456这条记录再表B中有2345,234两条记录与之相对应,这样的情况该如何处理,就需要LZ提出更明确的需求了
      

  9.   

    呵呵,回楼主,没看清你下面说的“其中B.b所有项都是唯一的,B.a也是唯一的 ”,如是这样用这条sql就可以实现了。