【问题标题】:Error trying to use Merge Into instead of Update尝试使用 Merge Into 而不是 Update 时出错
【发布时间】:2018-03-21 22:45:48
【问题描述】:

我正在尝试加快我的更新并将我的更新/设置语句转换为合并到/使用。

旧版本

ALTER SESSION ENABLE PARALLEL DML;
UPDATE /*+ PARALLEL(16) */ TEST_REPORT_2 rep 
SET    ( title ) = (
SELECT /*+ PARALLEL(16) */ doctitle.valstr Title 
FROM   MV_LLATTRDATA_SHRUNK_V3 doctitle 
WHERE  doctitle.id = rep.dataid 
    AND doctitle.defid = 3072256 
    AND doctitle.attrid = 5 
    AND doctitle.vernum = (SELECT MV.MAX_VERNUM
                                FROM   MV_LLATTRDATA_MAX_VERSIONS_V1 MV
                                WHERE  MV.id = rep.dataid
                                    AND defid = 3072256 
                                    AND attrid = 5) 
    AND doctitle.defvern = (SELECT MV.MAX_DEFVERN
                                FROM   MV_LLATTRDATA_MAX_VERSIONS_V1 MV
                                WHERE  MV.id = rep.dataid  
                                    AND defid = 3072256 
                                    AND attrid = 5)); 

新版本

MERGE INTO TEST_REPORT_2 REP
USING MV_LLATTRDATA_SHRUNK_V3 doctitle
    ON (REP.DATAID = doctitle.ID
        AND doctitle.defid = 3072256 
        AND doctitle.attrid = 5 
        AND doctitle.vernum = (SELECT MV.MAX_VERNUM
                                FROM   MV_LLATTRDATA_MAX_VERSIONS_V1 MV
                                WHERE  MV.id = rep.dataid
                                    AND defid = 3072256 
                                    AND attrid = 5) 
        AND doctitle.defvern = (SELECT MV.MAX_DEFVERN
                                FROM   MV_LLATTRDATA_MAX_VERSIONS_V1 MV
                                WHERE  MV.id = rep.dataid))
WHEN MATCHED THEN UPDATE SET
    TITLE = doctitle.VALSTR;

但是我收到一条错误消息:“ORA-01427:单行子查询返回多于一行”

【问题讨论】:

  • 不管眼前的问题(使 MERGE 工作) - 为什么您期望 MERGE 比 UPDATE 更快?双向测试——如果你能发布你发现的东西,这对我们所有人都有启发。

标签: sql database oracle plsql


【解决方案1】:

也许defvern 的逻辑需要包含defid 和attrid`?

    AND doctitle.vernum = (SELECT MV.MAX_VERNUM
                            FROM   MV_LLATTRDATA_MAX_VERSIONS_V1 MV
                            WHERE  MV.id = rep.dataid
                                AND defid = 3072256 
                                AND attrid = 5) 
    AND doctitle.defvern = (SELECT MV.MAX_DEFVERN
                            FROM   MV_LLATTRDATA_MAX_VERSIONS_V1 MV
                            WHERE  MV.id = rep.dataid
                                AND defid = 3072256 
                                AND attrid = 5) 

这就是update 中的逻辑结构。

【讨论】:

  • 哦,这是一个糟糕的复制/粘贴工作,我不再收到错误了。
【解决方案2】:

这种形式的select语句之一:

some_column = (select x from y where z)

正在重新调整多个值。

一个简单的解决方法是:

some_column = (select max(x) from y where z)

但是你必须以一种或另一种方式强制这个选择只返回一个值

【讨论】:

  • 你指的是与AND doctitle.vernum相关的子查询
猜你喜欢
  • 2014-10-20
  • 2020-09-15
  • 2017-04-30
  • 2023-01-27
  • 2020-09-26
  • 2015-01-02
  • 2022-01-16
  • 2022-12-01
  • 1970-01-01
相关资源
最近更新 更多