查询返回:ORA-01427单行子查询返回多行

时间:2020-09-07 10:41:18

标签: sql oracle sql-update

我正在尝试将下面的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);

2 个答案:

答案 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;
相关问题