更新语句中的“单行子查询返回多行”

Posted

技术标签:

【中文标题】更新语句中的“单行子查询返回多行”【英文标题】:"Single-row subquery returns more than one row" in Update statement 【发布时间】:2017-08-15 07:31:57 【问题描述】:

几天来,我一直在努力弄清楚如何使我的update 声明起作用。 select 语句似乎按预期工作,但是当我尝试更新列值时,我收到 ORA-01427 single-row subquery returns more than one row 错误。

代码如下:

UPDATE tbl_metrics
SET act_end_time = (WITH base
AS (SELECT caseid, entry_timestamp
       FROM activity
      WHERE act_id IN (100, 700, 300)
      )  
SELECT t1.entry_timestamp
FROM base t1, tbl_metrics t2
WHERE t1.caseid = t2.caseid
AND t2.act_start_time < (SELECT MIN(t1.entry_timestamp) FROM base t1 WHERE t1.caseid = t2.caseid))

这个想法是tbl_metrics.act_end_time 列使用activity 表中的最低entry_timestamp 值更新,其中activity.caseid=tbl_metrics.caseidactivity.entry_timestamp&gt;tbl_metrics.act_start_timeactivity.act_id 是100、700 或300。

【问题讨论】:

可能想从更新的位置开始 @Patrick 你能说得更具体点吗?我一直在纠结这个太久了,我完全迷路了。 【参考方案1】:

我觉得应该是这样的:

UPDATE tbl_metrics t2
SET act_end_time = 
    (SELECT MIN(t1.entry_timestamp) 
    FROM activity t1 
    WHERE act_id IN (100, 700, 300)
        AND t1.entry_timestamp > t2.act_start_time
        AND t1.caseid = t2.caseid)

【讨论】:

效果很好,谢谢。很好很简单。性能比我想象的要好,不需要with 部分就不必去activity 表来获取act_id 的集合

以上是关于更新语句中的“单行子查询返回多行”的主要内容,如果未能解决你的问题,请参考以下文章

无法更新表中的列 它返回单行子查询返回多个

ORA-01427 单行子查询返回多行 - 如何解决?

更新期间子查询返回多行

错误(单行子查询返回多行)

Oracle 单行子查询在使用嵌套子查询时返回多行

收到“单行子查询返回多行”错误