【问题标题】:Query returning : ORA-01427 Single-row subquery returning more than one row查询返回:ORA-01427 单行子查询返回多于一行
【发布时间】:2020-09-07 10:41:18
【问题描述】:

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

【问题讨论】:

    标签: sql oracle sql-update


    【解决方案1】:

    你可以试试下面,

    我使用了coalesce,以防queue 列不匹配,它会将其视为空值并取而代之的是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);
    

    【讨论】:

      【解决方案2】:

      如之前的回答中所建议的,请使用密钥保留视图将此类 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;
      

      【讨论】:

        猜你喜欢
        • 2017-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多