【问题标题】:Not able to merge records in Oracle database using merge statement无法使用合并语句合并 Oracle 数据库中的记录
【发布时间】:2017-06-07 20:40:05
【问题描述】:
SELECT * FROM DIM_TRANS_TYPE WHERE TRANSACTION_TYPE='ILAU';

我在这里要做的就是将上述记录中的ILAU 更改为IFAUInstant Loan Authorization Request 更改为Instant Finance Authorization Request

表架构:

Name                  Null     Type               
--------------------- -------- ------------------ 
TRANSACTION_TYPE      NOT NULL VARCHAR2(4 CHAR)   --> PRIMARY KEY
TRANSACTION_TYPE_DESC          VARCHAR2(256 CHAR) 

工作!!!

MERGE INTO DIM_TRANS_TYPE a
USING (SELECT 'ILAU' TRANSACTION_TYPE, 'Instant Loan Authorization Request' TRANSACTION_TYPE_DESC FROM DUAL) b
    ON (a.TRANSACTION_TYPE = b.TRANSACTION_TYPE)
WHEN MATCHED THEN UPDATE
    SET
      a.TRANSACTION_TYPE_DESC = 'Instant Finance Authorization Request'
WHEN NOT MATCHED THEN
    INSERT(a.TRANSACTION_TYPE, a.TRANSACTION_TYPE_DESC)
    VALUES(b.TRANSACTION_TYPE, b.TRANSACTION_TYPE_DESC);

不工作!!! (错误如下)

MERGE INTO DIM_TRANS_TYPE a
USING (SELECT 'ILAU' TRANSACTION_TYPE, 'Instant Loan Authorization Request' TRANSACTION_TYPE_DESC FROM DUAL) b
    ON (a.TRANSACTION_TYPE = b.TRANSACTION_TYPE)
WHEN MATCHED THEN UPDATE
    SET
      a.TRANSACTION_TYPE = 'IFAU',
      a.TRANSACTION_TYPE_DESC = 'Instant Finance Authorization Request'
WHEN NOT MATCHED THEN
    INSERT(a.TRANSACTION_TYPE, a.TRANSACTION_TYPE_DESC)
    VALUES(b.TRANSACTION_TYPE, b.TRANSACTION_TYPE_DESC);

错误:

Error at Command Line : 5 Column : 9
Error report -
SQL Error: ORA-38104: Columns referenced in the ON Clause cannot be updated: "A"."TRANSACTION_TYPE"
38104. 00000 -  "Columns referenced in the ON Clause cannot be updated: %s"
*Cause:    LHS of UPDATE SET contains the columns referenced in the ON Clause
*Action:

【问题讨论】:

  • 能否请您发布 DIM_TRANS_TYPE 的架构
  • 刚刚用表架构更新了上面的帖子
  • 错误信息很清楚,不能更新on中引用的列是merge的限制之一。检查文档docs.oracle.com/cd/B28359_01/server.111/b28286/…
  • 这个错误看起来很简单,你不能更新 ON 子句 (a.TRANSACTION_TYPE) 中的列匹配。您可以插入一个新表然后更新您的原始表,使它们不是同一列吗?

标签: sql oracle sql-merge


【解决方案1】:

如错误消息所示,无法更新on 子句中使用的字段。

您必须在单独的语句中进行此类更新。像这样的:

UPDATE DIM_TRANS_TYPE
SET    TRANSACTION_TYPE = 'IFAU',
       TRANSACTION_TYPE_DESC = 'Instant Finance Authorization Request'
WHERE  TRANSACTION_TYPE IN (
            SELECT TRANSATION_TYPE
            FROM   (SELECT 'ILAU' TRANSACTION_TYPE, 
                           'Instant Loan Authorization Request' TRANSACTION_TYPE_DESC 
                    FROM DUAL)
       );

MERGE INTO DIM_TRANS_TYPE a
USING      (SELECT 'ILAU' TRANSACTION_TYPE, 
                   'Instant Loan Authorization Request' TRANSACTION_TYPE_DESC 
            FROM   DUAL) b
        ON (a.TRANSACTION_TYPE = b.TRANSACTION_TYPE)
WHEN NOT MATCHED THEN
    INSERT(TRANSACTION_TYPE, TRANSACTION_TYPE_DESC)
    VALUES(b.TRANSACTION_TYPE, b.TRANSACTION_TYPE_DESC);

您可能希望在事务中执行此操作,以便提交由这两个语句中的一个或两个语句引起的更改。

当然,IN 子句看起来有点夸张,因为它的值可以简单地与 ILAU 进行比较,但我假设你简化了这个问题,而实际上你有一个更大的数据集来获取 transaction_type 值.

【讨论】:

    【解决方案2】:

    也许我遗漏了一些东西....看来您正在寻找transaction_type = 'ILAU'不管transaction_type_desc)所在的所有行,并更新这些行transaction_type'IFAU'transaction_type_desc'Instant Finance Authorization Request'。对吧?

    如果是这样,除了琐碎的UPDATE 语句之外,您为什么需要其他任何东西?

    update  dim_trans_type
      set   transaction_type      = 'IFAU',
            transaction_type_desc = 'Instant Finance Authorization Request'
      where transaction_type      = 'ILAU'
    ;
    

    在您的尝试中,还有一个 when not matched 子句 - 如果现有行都没有 transaction_type = 'ILAU',则插入一行。这和你的要求有什么关系?你说我想在这里完成的只是改变[.....] - 没有提到插入任何东西。用简单的英语表达的问题陈述是否不完整?还是你在插入不需要插入的东西?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2017-03-13
      • 2013-05-11
      • 1970-01-01
      相关资源
      最近更新 更多