ORACLE UPDATE JOIN的问题

157 阅读1分钟

以下代码在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}