update ope_case a set a.qicaoren=
(
    select b.lzxx_fzr from (
    select min(lzxx_jssj),lzxx_gzbh||''||lzxx_gzdl as lzxx_gzbh,lzxx_fzr --公证编号+公证大类
from dongguang.gz_data_lzxx where lzxx_ztwmc = '起草' 
group by lzxx_gzbh||''||lzxx_gzdl,lzxx_fzr order by lzxx_gzbh
) b where a.caseid=b.lzxx_gzbh
);
这个语句有问题吗?表里面数据少就执行的快,十几万条记录更新了1小时还没完成,是怎么回事?请告诉指点。谢谢!

解决方案 »

  1.   

    你的SQL有问题,其中min(lzxx_jssj)似乎没有用到,另外你可能需要再理解一下需求
      

  2.   


    update ope_case a set a.qicaoren=(
    select b.lzxx_fzr from (
          select min(lzxx_jssj),lzxx_gzbh||''||lzxx_gzdl as lzxx_gzbh,lzxx_fzr --公证编号+公证大类  --lzxx_fzr这个好像也没用。
             from dongguang.gz_data_lzxx 
                  where lzxx_ztwmc = '起草' and ope_case.caseid=dongguang.gz_data_lzxx.lzxx_gzbh--把下边的where放到这里,会少很多行。
             group by lzxx_gzbh||''||lzxx_gzdl,lzxx_fzr 
             -- order by lzxx_gzbh 这个排序是没用的。因为检索出来的值要么是null,要么只有一行不可能二行。
          ) b --where a.caseid=b.lzxx_gzbh
    );这样可能会快一点
    说具体的业务逻辑是什么,每个字段是什么意思。想达到怎么样的结果,只有明白了其中的业务可能写出更适合更高效的sql语句。你只给出个sql优化是有限的。
      

  3.   

    我感觉你的语句可能下边的语句就可以完成。update ope_case 
         set a.qicaoren=(gzTable.lzxx_gzbh||''||gzTable.lzxx_gzdl)
         from dongguang.gz_data_lzxx gzTable
         where gzTable.lzxx_ztwmc = '起草' and ope_case.caseid=gzTable.lzxx_gzbh
    go我感觉你那个分组是没有意义的。你能说明一下lzxx_jssj,lzxx_gzbh,lzxx_fzr字段的作用吗?