我正在尝试将下面的Sybase查询转换为Oracle查询。
update Product set pd.age = (case when pd.exittime!= null then (sysdate -
pd.exittime)
else ( case when pd.queue = dp.queue
then (select (sysdate - pd.entrytime) from department dp1 where pd.id =
dp1.id ) else 2 END) END)
from Product pd,department dp
where pd.id > 1
AND pd.id = dp.id
AND pd.status in('1','7','2','5')
AND pd.currentstatus = dp.currentstatus
AND pd.activity= dp.activity;
但是我尝试在转换后在Oracle查询下执行,但是出现以下错误。
update Product pd set pd.age = (select (case when pd.exittime!= null then
(sysdate - pd.exittime)
else ( case when pd.queue = dp.queue
then (select (sysdate - pd.entrytime) from department dp1 where pd.id = dp1.id
) else 2 END) END)
from department dp
where pd.id > 1
AND pd.id = dp.id
AND pd.status in('1','7','2','5')
AND pd.currentstatus = dp.currentstatus
AND pd.activity= dp.activity)
where exists
(select 1 from department dp
where pd.id > 1
AND pd.id = dp.id
AND pd.status in('1','7','2','5')
AND pd.currentstatus = dp.currentstatus
AND pd.activity= dp.activity);
答案 0 :(得分:1)
您可以在下面尝试
如果列coalesce
没有匹配项,我会使用queue
,它将被视为null并取值2
。
update product pd
set pd.age = case
when pd.exittime != null then
(sysdate - pd.exittime)
else
coalesce((select (sysdate - pd.entrytime)
from department dp
where pd.queue = dp.queue
and pd.id = dp.id)
,2)
end
where pd.id > 1
and pd.status in ('1','7','2','5')
and exists (select 1
from department dp
where pd.id = dp.id
and pd.currentstatus = dp.currentstatus
and pd.activity = dp.activity);
答案 1 :(得分:0)
如先前答案中所建议,请使用键保留视图将此类Sybase更新查询转换为Oracle,因为Oracle不允许更新查询中的JOIN。
UPDATE (SELECT pd.age as age,
pd.id,
dp.id,
pd.currentstatus,
dp.currentstatus,
pd.activity,
dp.activity,
pd.status,
pd.exittime,
pd.queue,
dp.queue
FROM Product pd INNER JOIN department dp
ON (pd.id = dp.id AND pd.currentstatus = dp.currentstatus AND pd.activity= dp.activity)
WHERE pd.id > 1 AND pd.status in('1','7','2','5'))
SET pd.age = CASE WHEN pd.exittime!= null THEN 1
ELSE ( CASE WHEN pd.queue = dp.queue
THEN sysdate - pd.exittime
ELSE 2 END)
END;