where a.shj||ltrim(rtrim(a.chlhm)) in 
        (select b.shj||ltrim(rtrim(b.chlhm)) from jf_ls b) => (为了简化程序,用 trim() 替换 l,r 两个函数来分析)
where a.shj || trim(a.chlhm) 
  in (select b.shj || trim(b.chlhm) from jf_ls b)=>
where 0< (
   select count(*)
   from jf_ls 
   where (b.shj || trim(b.chlhm) = (a.shj || trim(a.chlhm))
)速度会快点,但看上去还是很复杂. :(

解决方案 »

  1.   

    多谢 chanet(牧师) ,我明天回单位试下。
      

  2.   

    请试试:update jf_all a set wl=(select wl from jf_ls b where  
             a.shj||ltrim(rtrim(a.chlhm))=b.shj||ltrim(rtrim(b.chlhm))) 
     where exists 
            (
              select  'X'
                from jf_ls b
                where b.shj||ltrim(rtrim(b.chlhm)) = a.shj||ltrim(rtrim(a.chlhm))
            )
      

  3.   

    prettylife(风过留痕):
        多谢回帖,我下午已经这样写了,跑起来似乎比 in 还要慢,为什么会这样我也不明白。
      

  4.   

    IN 和 exist在处理速度上的快慢.有很多种说法,但是在实际使用中还要根据自己的情况决定是用in 还是用exist.,
      

  5.   

    你的语句就执行前半句:update jf_all a set wl=(select wl from jf_ls b) where  
             a.shj||ltrim(rtrim(a.chlhm))=b.shj||ltrim(rtrim(b.chlhm)); 
    效果不是一样吗?因为已经关联一次了何必再用in呢?
    也可以考虑建立索引,如果你update的行数不超过1/3建立索引很有效的
      

  6.   

    感谢chanet(牧师)! 经你修改后的语句 在临时库中测试速度有提高,但是由于a库很大(>17万记录) ,所以运行速度还是很慢( 该语句需半月左右执行一次 )。还有什么好方法吗?
      

  7.   

    jackjingsg(飞翔的精灵) :
       update jf_all a set wl=(select wl from jf_ls b) where  
             a.shj||a.chlhm=b.shj||b.chlhm ;
      这样写跑不通啊!
      

  8.   

    --对不起啊,我没有测试, 
    --应该在加上trim然后试一下
    update jf_all a set wl=(select wl from jf_ls b where  a.shj||trim(a.chlhm)=b.shj||trim(b.chlhm));
    /**后面一个where可以不用,试一下*/
    /*测试结果
    4 rows updated
    Executed in 0 seconds 我用PL-SQL可以跑*/
      

  9.   

    同意 jackjingsg(飞翔的精灵)
      

  10.   

    可以提前用ltrim rtrim把两个表相应字段更新一边,去掉空格,再用上面不要trim的语句。
      

  11.   


     同意 牧师厉害 , 不同意 jackjingsg(飞翔的精灵):****************************************************************************
      update jf_all a set wl=(select wl from jf_ls b where  a.shj||trim(a.chlhm)=b.shj||trim(b.chlhm));
    /**后面一个where可以不用,试一下*/
    *****************************************************************************
      试吧!试了你就知道什么是后悔了!
      

  12.   

    将a.shj||ltrim(rtrim(a.chlhm))=b.shj||ltrim(rtrim(b.chlhm))) 
    写成a.shj=b.shj and a.chlhm=b.chlhm
    这样oracle可以使用索引了
    提供一点思路,也许不适合你现在的情况
    尽量使用索引,尽量避免在等式的左边使用表达式