以下代码在mysql中执行没问题,可以使用inner join来关联,在oracle中不支持这种语法。
UPDATE JB1 AS t0
INNER JOIN (
SELECT * FROM wssyjx.FA_YQSBGLJBXXMX t WHERE STATUS = 2 AND dj >= 800
AND SUBSTR(t.fldm, 1, 2) NOT IN ('01', '02', '11', '13', '15', '16')
AND t.syfx IN ('教学', '科研') AND t.sbbm = '202301481'
) AS t1 ON t0.devcode = t1.sbbm
AND t0.schcode = '12617'
AND t0.sfyx = 0
SET t0.devcode = (
CASE
WHEN LENGTH(NVL(t1.sbbm, '')) > 8 THEN SUBSTR(t1.sbbm, -8)
ELSE t1.sbbm
END
);
oracle 参考写法如下:
UPDATE JB1 t0
SET t0.devcode = (
SELECT CASE
WHEN LENGTH(NVL(t.sbbm, '')) > 8 THEN SUBSTR(t.sbbm, -8)
ELSE t.sbbm
END
FROM wssyjx.FA_YQSBGLJBXXMX t WHERE STATUS = 2 AND dj >= 800
AND SUBSTR(t.fldm, 1, 2) NOT IN ('01', '02', '11', '13', '15', '16')
AND t.syfx IN ('教学', '科研') AND t.sbbm = t0.devcode
)
where EXISTS(
SELECT * FROM wssyjx.FA_YQSBGLJBXXMX t WHERE STATUS = 2 AND dj >= 800
AND SUBSTR(t.fldm, 1, 2) NOT IN ('01', '02', '11', '13', '15', '16')
AND t.syfx IN ('教学', '科研') AND t.sbbm = t0.devcode
)
AND t0.schcode = #{schcode}
AND t0.sfyx = 0
AND t0.xnxqzj = #{nd}