【问题标题】:How to use ORACLE MERGE statement to INSERT values using DECODE?如何使用 ORACLE MERGE 语句使用 DECODE 插入值?
【发布时间】:2015-01-30 05:30:08
【问题描述】:

我正在尝试将 MERGE 用于 UPSERT。此 MERGE 语句的更新代码运行良好(我尚未在此处发布),但 INSERT 给出以下错误:

  • ORA-00963 ---缺少表达式(当在 INSERT-VALUES 中提到 SELECT 时)
  • ORA-00917 --- 缺少逗号(删除 SELECT 时)
  • 当我格式化此代码时,它要求在 VALUES 附近进行语法检查并指向 AS 子句。

基本上,我想编写包含 DECODE 语句的 MERGE-INSERT 语句。 请帮助我,因为我是 Oracle 的新手。

MERGE INTO Table1 t1
   USING(SELECT DISTINCT A_cd, F_str, a_pm, a_type 
        FROM Table2) t2
     ON(t1.C_Name=t2.A_cd)
WHEN NOT MATCHED 
THEN
 INSERT(C_type, C_name, C_value)
  VALUES (SELECT t3.C_type, t4.A_cd as C_name,
        DECODE(t3.c_type,
               'A COMP', t4.f_str,
               'A_PM', t4.a_pm,
               'A_TYPE' t4.a_type) as c_value)
 FROM(SELECT 'A_COMP' as c_type FROM DUAL
    UNION ALL
    SELECT 'A_PM' as c_type FROM DUAL
    UNION ALL
    SELECT 'A_TYPE' as c_type FROM DUAL)t3,
   (SELECT DISTINCT A_cd, F_str, a_pm, a_type
    FROM Table2 t2
    WHERE A_cd || F_str || a_pm || a_type
    IS NOT NULL
    AND NOT EXISTS
    (SELECT NULL
    FROM Table1 t1
    WHERE t2.A_cd=t1.c_name))t4;

【问题讨论】:

  • 您可以在答案中检查正确的代码

标签: sql oracle11g merge decode insert-update


【解决方案1】:

使用merge插入时不能使用select语句,所以对于值,你必须在'using'关键字之后使用select语句,然后将select的值传递给insert语句。

  MERGE INTO Table1 t1
  USING (SELECT t3.C_type, t4.A_cd as C_name,
      DECODE(t3.c_type,
       'A COMP', t4.f_str,
       'A_PM', t4.a_pm,
       'A_TYPE' t4.a_type) as c_value)
    FROM(SELECT 'A_COMP' as c_type FROM DUAL
    UNION ALL
     SELECT 'A_PM' as c_type FROM DUAL
     UNION ALL
     SELECT 'A_TYPE' as c_type FROM DUAL)t3,
    (SELECT DISTINCT A_cd, F_str, a_pm, a_type
      FROM Table2 t2
      WHERE A_cd || F_str || a_pm || a_type
      IS NOT NULL
       AND NOT EXISTS
      (SELECT NULL
      FROM Table1 t1
        WHERE t2.A_cd=t1.c_name))t4
   ON(t1.C_Name=t4.A_cd)
  WHEN NOT MATCHED 
  THEN
  INSERT(C_type, C_name, C_value)
  values(t4.C_type, t4.C_name,t4.c_value);

【讨论】:

  • 是的,这意味着您不能将 select 语句与使用 merge 的 insert 一起使用,oracle 在使用 select 语句插入记录时也不允许使用“values”关键字,所以无论您的 select 语句在那里,您都必须像我一样在“使用”关键字之后放置,然后在插入记录时调用这些值。
  • 插入的合并语法不接受没有 'VALUES' 关键字的 SELECT。它就像: - 匹配时合并使用,然后不匹配时更新集,然后插入(列名)值();
  • 是的,这是正确的语法,再次刷新页面
  • 是的,我知道语法。我要做的是在“VALUES”关键字中使用 DECODE,因为目标表是源表的转置。我也不确定 Oracle 中是否允许使用别名“AS”列名。
  • 如果您需要在 insert 中使用 select 语句,则语法为 insert(C_type, C_name, C_value) values((select c_type from your_table),(select c_name from your_table),(select c_value from你的表));但是在这里,如果它每次都返回单行,那么它的 okk else 错误将是一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多