把 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')))
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')))
改成INTERSECT
试一下吧
-----------------------------------------
我也觉得这样会好一些。
而且工作量也不小