MERGE 语句错误

Posted

技术标签:

【中文标题】MERGE 语句错误【英文标题】:MERGE statement ERRORS 【发布时间】:2015-07-20 12:44:32 【问题描述】:

运行 MERGE 语句时出现此错误:

Error report -
SQL Error: ORA-00904: "SRC"."TB2"."WAERS": invalid identifier
00904. 00000 -  "%s: invalid identifier".

这是我的声明:

MERGE INTO costing. TB1 USING
(SELECT costing.TB1.ROWID row_id,
        costing.TB2.WAERS
   FROM costing.TB2
   JOIN costing.TB3
     ON costing.TB2.BUKRS = costing.TB3.BUKRS
   JOIN costing.TB1
     ON costing.TB3.MANDT = Client
    AND costing.TB3.BWKEY = costing.TB1.Plant
  WHERE Currency_Conversion_Status <> 'Pricing Missing'
) src ON ( costing.TB1.ROWID = src.row_id )
WHEN MATCHED THEN
  UPDATE SET Currency = src.TB2.WAERS;

【问题讨论】:

【参考方案1】:

您试图在子查询之外使用您在 src 子查询中定义的别名。这永远行不通。

我建议使用表别名来使列引用更容易查看 - 这是我要做的:

merge into costing.tb1 tgt
using (select t1.rowid row_id,
              t2.waers
       from   costing.tb2 t2
              join costing.tb3 t3 on t2.bukrs = t3.bukrs
              join costing.tb1 t1 on t3.mandt = client -- missing alias on client
                                  and t3.bwkey = t1.plant
       where  currency_conversion_status <> 'Pricing Missing' -- missing alias on currency_conversion_status
      ) src 
  on (tgt.rowid = src.row_id )
when matched then
  update set tgt.currency = src.waers;

我建议您还添加来自 client 和 currency_conversion_status 的缺失别名,以便您可以分辨它们属于哪些表。

如果 client 是 costing.tb1 中的一列,那么您可能不需要在子查询中包含与 tb1 的连接,您可以直接在 MERGE 语句中连接它,例如:

merge into costing.tb1 tgt
using (select t3.mandt,
              t3.bwkey,
              t2.waers
       from   costing.tb2 t2
              join costing.tb3 t3 on t2.bukrs = t3.bukrs
       where  currency_conversion_status <> 'Pricing Missing' -- missing alias on currency_conversion_status
      ) src 
  on (tgt.client = src.mandt
      and tgt.plant = src.bwkey)
when matched then
  update set tgt.currency = src.waers;

虽然我不知道 currency_conversion_status 属于哪个表 - 您可能必须将 where 子句所在的位置移动。

通过这样做,您将删除对 costing.tb1 表的不必要连接,这应该会提高语句的性能。

【讨论】:

如果我将 tgt 别名添加到 currency_conversion_status,它会显示无效标识符。 该列在 tb1 中?如果是这样,将 where 移到外部查询(即更新集 ... where ...) 我想在 sql server 中上传有空格的数据,但是当我在 oracle 中上传相同的数据时,结果为空。问题是我的程序有条件检查''。所以它不会返回任何结果。当我将我的代码从 sql srver 迁移到 oracle 时。 这真的应该是一个单独的问题。我不知道为什么在 Oracle 中插入空格会插入 null - 除非可能正在使用修剪。不过,您的应用程序应该更改为正确处理 null 情况。使用空格来表示没有数据并不理想。

以上是关于MERGE 语句错误的主要内容,如果未能解决你的问题,请参考以下文章

MERGE 语句错误

DB2 MERGE 语句错误

SQL 合并错误:MERGE 语句试图更新或删除 [重复]

过程包体中的 Oracle Merge 语句错误

SQL 错误:“嵌套的 INSERT、UPDATE、DELETE 或 MERGE 语句必须具有 OUTPUT 子句。” - 在 Azure Databricks 中执行时

IF EXISTS 和 MERGE 语句