【问题标题】:Oracle insert if not exists statementoracle insert if not exists 语句
【发布时间】:2012-06-05 04:31:44
【问题描述】:
insert into OPT (email, campaign_id) values('mom@cox.net',100)
where not exists( select * from OPT where (email ="mom@cox.net" and campaign_id =100)) ;

错误报告:SQL 错误:ORA-00933:SQL 命令未正确结束 00933. 00000 - “SQL 命令未正确结束” *原因:
*行动:

如果Oracle中不存在新行,如何插入?

【问题讨论】:

    标签: oracle


    【解决方案1】:

    根据已经存在的另一条记录插入某些内容(在 Oracle 中)的正确方法是使用 MERGE 语句。

    请注意,这个问题已经在这里回答了:

    【讨论】:

      【解决方案2】:
      insert into OPT (email, campaign_id) 
      select 'mom@cox.net',100
      from dual
      where not exists(select * 
                       from OPT 
                       where (email ='mom@cox.net' and campaign_id =100));
      

      【讨论】:

      • 简单而巧妙的批量插入。谢谢
      【解决方案3】:
      insert into OPT       (email,        campaign_id) 
      select 'mom@coxnet' as email, 100 as campaign_id from dual MINUS
      select                 email,        campaign_id from OPT;
      

      如果 OPT 中已经有 mom@cox.net/100 的记录,MINUS 将从 select 'mom@coxnet' as email, 100 as campaign_id from dual 记录中减去此记录,并且不会插入任何内容。另一方面,如果没有这样的记录,MINUS 不会减去任何内容,并将插入值 mom@coxnet/100

      正如 p.marino 已经指出的那样,merge 可能是解决您的问题的更好(和更正确)的解决方案,因为它是专门为解决您的任务而设计的。

      【讨论】:

        【解决方案4】:
        MERGE INTO OPT
        USING
            (SELECT 1 "one" FROM dual) 
        ON
            (OPT.email= 'mom@cox.net' and OPT.campaign_id= 100) 
        WHEN NOT matched THEN
        INSERT (email, campaign_id)
        VALUES ('mom@cox.net',100) 
        ;
        

        【讨论】:

        • 点评来源: 您好,请不要只回答源代码。尝试对您的解决方案如何工作提供一个很好的描述。请参阅:How do I write a good answer?。谢谢
        【解决方案5】:

        另一种方法是利用 oracle 的 INSERT ALL 语法,

        INSERT ALL 
            INTO table1(email, campaign_id) VALUES (email, campaign_id)
        WITH source_data AS
         (SELECT 'mom@cox.net' email,100 campaign_id
          FROM   dual
          UNION ALL
          SELECT 'dad@cox.com' email,200 campaign_id
          FROM   dual)      
        SELECT email
              ,campaign_id
        FROM   source_data src
        WHERE  NOT EXISTS (SELECT 1
                FROM   table1 dest
                WHERE  src.email = dest.email
                AND    src.campaign_id = dest.campaign_id);
        

        INSERT ALL 还允许我们基于子查询作为源对多个表执行条件插入

        有一些非常干净和很好的例子可供参考。

        1. oracletutorial.com
        2. oracle-base.com/

        【讨论】:

          猜你喜欢
          • 2011-11-28
          • 2021-10-20
          • 2012-01-03
          • 1970-01-01
          • 1970-01-01
          • 2015-05-16
          • 2012-11-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多