“使用”条件有空值时 ORACLE 合并无法按预期工作

问题描述 投票:0回答:1

我需要在目标表中输入条目,但在两种不同的场景中

  1. 如果目标表中已经存在记录需要更新某些值
  2. 如果不存在记录我需要插入记录

我选择了“合并”来做到这一点

MERGE INTO target tar
            USING (SELECT  DISTINCT A.col1,B.col1,A.col2
            FROM target A   JOIN src B 
            ON A.col1=B.col1 AND B.col2 =A.col2
            ) src
        ON (src.col1=tar.col1 and src.col2=tar.col2 )
        WHEN MATCHED THEN
                UPDATE SET tar.col4 =37,
                           tar.col5=6,
                           tar.col6=SYSDATE,
                           tar.col7=123,
                           tar.col8=SYSDATE,
                           tar.col9=123
            WHEN NOT MATCHED  THEN
                INSERT (tar.col1,tar.col2,tar.col3,tar.col4)
                values( src.col1,src.col2,37,6,);

我在“使用”中使用的选择查询的问题是获取空结果 我的期望是这是“不匹配”条件,它应该导致插入记录

但这不是合并 如果在“使用”条件下得出空结果,oracle Merge 会不起作用吗?

sql oracle merge
1个回答
0
投票

但这不是合并

当查询有语法错误时它将不起作用:

  • SELECT  DISTINCT A.col1,B.col1,A.col2
    FROM target A   JOIN src B 
    ON A.col1=B.col1 AND B.col2 =A.col2
    
    选择了两个
    col1
    列。既然您测试了
    A.col1=B.col1
    ,那么您可以从
    col1
    子句中删除重复的
    SELECT
  • INSERT (tar.col1,tar.col2,tar.col3,tar.col4)
    values( src.col1,src.col2,37,6,)
    
    有一个虚假的尾随逗号。

您可以将查询简化为:

MERGE INTO target tar
USING src
ON (src.col1 = tar.col1 AND src.col2 = tar.col2)
WHEN MATCHED THEN
  UPDATE
  SET col4 = 37,
      col5 = 6,
      col6 = SYSDATE,
      col7 = 123,
      col8 = SYSDATE,
      col9 = 123
WHEN NOT MATCHED THEN
  INSERT (col1, col2, col3, col4)
  VALUES (src.col1, src.col2, 37, 6);
© www.soinside.com 2019 - 2024. All rights reserved.