【发布时间】: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