【问题标题】:MERGE table from two different schema来自两个不同模式的 MERGE 表
【发布时间】:2018-04-10 08:30:04
【问题描述】:

我有两个来自两个不同架构的相同表,架构之间的数据库链接已经创建。模式 B(旧)中的表需要合并到模式 A(新)。两种模式之间的表结构是相同的,只是模式A中存在一个额外的时间戳列。时间戳值在合并时默认为SYSDATE。

当我尝试在架构 B 中运行以下脚本时,它会抱怨

ORA-00904: "A"."LAST_UPDATED_TIMESTAMP": 无效标识符

MERGE INTO LOOKUP_RANGE A
USING (SELECT RANGE_NAME,RANGE_TYPE,RANGE_MIN,RANGE_MAX,RANGE_DESC FROM LOOKUP_RANGE) B
ON (A.RANGE_NAME = B.RANGE_NAME AND A.RANGE_TYPE = B.RANGE_TYPE)
WHEN MATCHED THEN UPDATE SET A.RANGE_MIN = B.RANGE_MIN, A.RANGE_MAX = B.RANGE_MAX,A.LAST_UPDATED_TIMESTAMP = SYSDATE,A.RANGE_DESC = B.RANGE_DESC
WHEN NOT MATCHED THEN INSERT (A.RANGE_MIN,A.RANGE_MAX,A.LAST_UPDATED_TIMESTAMP,A.RANGE_DESC) VALUES (A.RANGE_MIN,A.RANGE_MAX,SYSDATE,A.RANGE_DESC);

ON 中的键列是表的主键。 我是否在错误的模式中执行?它应该在模式 A 中运行?

【问题讨论】:

  • 您没有在语句中使用任何 DBLink。这些表名是同义词吗?
  • 是的,两个模式中的表名相同,只有 LAST_UPDATED_TIMESTAMP 是模式 A(新)中存在的新列。
  • 您的查询只包含一个没有任何模式前缀的表,所以我不明白“表在两个模式中是相同的”是什么意思。您使用的两个表名都引用当前用户架构中的同一个表。您的查询中没有完全限定的表名会使用来自不同架构的表
  • 明白。如何在查询中指定带有模式前缀的表名?我不想硬编码模式名称。
  • 您希望相同的非限定名称在同一个查询中引用两个不同的表?这是不可能的

标签: oracle sql-merge ora-00904


【解决方案1】:

以下代码完美运行。 B_MIG_61_TO_74 是创建的数据库链接,OLD 是旧架构的架构名称,NEW 是新架构的架构名称

MERGE INTO NEW.LOOKUP_RANGE A USING (SELECT RANGE_NAME,RANGE_TYPE,RANGE_MIN,RANGE_MAX,RANGE_DESC FROM OLD.LOOKUP_RANGE@DB_MIG_61_TO_74) B ON (A.RANGE_NAME = B.RANGE_NAME AND A.RANGE_TYPE = B.RANGE_TYPE) WHEN MATCHED THEN UPDATE SET A.RANGE_MIN = B.RANGE_MIN, A.RANGE_MAX = B.RANGE_MAX,A.LAST_UPDATED_TIMESTAMP = SYSDATE,A.RANGE_DESC = B.RANGE_DESC WHEN NOT MATCHED THEN INSERT (A.RANGE_NAME,A.RANGE_TYPE,A.RANGE_MIN,A.RANGE_MAX,A.LAST_UPDATED_TIMESTAMP,A.RANGE_DESC) VALUES (B.RANGE_NAME,B.RANGE_TYPE,B.RANGE_MIN,B.RANGE_MAX,SYSDATE,B.RANGE_DESC);

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多