把 IN 换成 EXISTS 试试:
UPDATE LANWAN.HR_J_EMPLOYEESALARY A
   SET A.MONEY = 1 * (SELECT B.RUN_YEAR
                        FROM LANWAN.HR_J_EMPLOYEEINFORM B  --B表数据3600
                       WHERE B.WORKER_CODE = A.WORKER_CODE)
 WHERE A.PUT_YEAR = '2005'
   AND A.PUT_MONTH = '03'
   AND A.INCOME_ITEM_CODE = '0008'
   AND A.SALARY_TYPE_CODE = '0001'--过滤后A表数据3600
   AND (EXISTS(SELECT C.WORKER_CODE
                 FROM LANWAN.HR_J_SALARYPERMARK C  
                WHERE C.WORKER_CODE=A.WORKER_CODE
                  AND C.MARKID = '01'   --本行过滤后 C表数据3600条
                  AND (C.MARK = 'Y' OR C.MARK = 'T')) 
         OR
        EXISTS
             (SELECT B.WORKER_CODE  --这里目前能检索到4条数据
                 FROM LANWAN.HR_J_EMPLOYEEINFORM B 
                WHERE B.RUN_YEAR > 25
                  AND B.WORKER_CODE=A.WORKER_CODE
                  AND EXISTS (SELECT C.WORKER_CODE
                                          FROM LANWAN.HR_J_SALARYPERMARK C
                                         WHERE C.WORKER_CODE=B.WORKERCODE
                                           AND C.MARKID = '01'
                                           AND C.MARK = 'F')))

解决方案 »

  1.   

    把你的子查询写成视图,用关联, 不要用IN.在相应的字段上建索引(如果记录很多的话),比如c.id,c.等字段.
      

  2.   

    把IN 
    改成INTERSECT
    试一下吧
      

  3.   

    把你的子查询写成视图,用关联, 不要用IN.在相应的字段上建索引(如果记录很多的话),比如c.id,c.等字段.
    -----------------------------------------
    我也觉得这样会好一些。
      

  4.   

    因为我们的项目是算工资,相关的数据很多,而且类似的sql语句也要写不少,如果每个建索引的话,是不是会对维护什么的产生影响?
    而且工作量也不小