【问题标题】:Need a fix for merge update query (Simple but still confusing)需要修复合并更新查询(简单但仍然令人困惑)
【发布时间】:2012-05-30 16:46:06
【问题描述】:
MERGE INTO table_1 a   
USING      
 (SELECT * from table_2) b  ON ( a.row_id = b.row_id and a.in_correct IS NULL) 
WHEN MATCHED THEN UPDATE SET a.in_correct = 'Y'; 

在上述查询中 ORA-38104:ON 子句中引用的列无法更新。

我已经坐了几个小时来解决这个问题。

我发现问题出在 in_correct 字段上。

此字段“in_correct”不能放在 ON 子句中,也不能放在 SET 后面。但是为了满足我的条件,我别无选择。

请帮帮我

【问题讨论】:

  • 您提到:“为了满足我的标准,我别无选择”。请告诉我们您的标准。
  • @peter:条件是我想在ON子句中检查in_correct是否为NULL
  • @peter:我必须更新表 A 中的一个字段,条件是来自表 A 数据和表 B 数据的字段。所以我使用了合并更新。我使用过的查询(在我的问题中看到)如果我指定一个列名(在更新和 ON 子句中都存在)失败。希望我很清楚

标签: oracle oracle10g oracle11g


【解决方案1】:
MERGE INTO table_1 a USING
    (SELECT * from table_2) b 
ON ( a.row_id = b.row_id) 
WHEN MATCHED THEN UPDATE 
  SET a.in_correct = NVL(in_correct, 'Y');

更新:

更“通用”的命令(用于非空值):

MERGE INTO table_1 a USING
    (SELECT * from table_2) b 
ON ( a.row_id = b.row_id) 
WHEN MATCHED THEN UPDATE 
  SET a.in_correct = case 
                 when in_correct = 'valuetobereplaced' then 'Y'; 
                 else in_correct; 
                 end;

【讨论】:

  • @peter 这适用于空值。但是如果我有一个常量说值 1,所有值都是 1。它必须替换为 Y,我该怎么办
  • 很简单:SET a.in_correct = case when in_correct = '1' then 'Y';否则不正确;结束
  • @peter 我用了替换功能。它不起作用。replace(1,'Y')。它不起作用。有没有这样的东西,,直接替换命令
  • 你试过上面的命令了吗? ...好的,我会编辑我的回复
  • @peter 在上面编辑的响应中,在查询的末尾,在[end]之后,如果我添加.. where rownum > 5,则查询不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 2016-11-13
  • 2016-02-09
  • 2011-03-15
  • 1970-01-01
相关资源
最近更新 更多