【问题标题】:Insert statement with where condition throws error带有 where 条件的插入语句会引发错误
【发布时间】:2016-07-02 21:15:39
【问题描述】:

以下 SQL 语句在 Oracle 中引发错误:

INSERT INTO TABLE1 (ACCT_NB, ACCT_TYPE, TOKEN_ID)
SELECT ACCT_NB, 'A', ID FROM TABLE2
WHERE NOT IN (SELECT ACCT_NB FROM TABLE1 
              WHERE ACCT_TYPE='A' AND TABLE1.ACCT_NB=TABLE2.ACCT_NB)

SQL 命令未正确结束。 请帮助更正查询

【问题讨论】:

    标签: sql oracle syntax-error sql-insert


    【解决方案1】:

    您缺少not in 运算符的左侧。我认为应该是ACCT_NB:

    INSERT INTO TABLE1 (ACCT_NB, ACCT_TYPE, TOKEN_ID)
    SELECT ACCT_NB, 'A', ID 
    FROM   TABLE2
    WHERE  ACCT_NB NOT IN (SELECT ACCT_NB 
                           FROM   TABLE1 
                           WHERE  ACCT_TYPE='A' AND TABLE1.ACCT_NB=TABLE2.ACCT_NB)
    

    【讨论】:

      【解决方案2】:

      使用not exists:

      INSERT INTO TABLE1(ACCT_NB, ACCT_TYPE, TOKEN_ID)
          SELECT ACCT_NB, 'A', ID
          FROM TABLE2
          WHERE NOT EXISTS (SELECT 1
                            FROM TABLE1 
                            WHERE ACCT_TYPE = 'A' AND TABLE1.ACCT_NB = TABLE2.ACCT_NB
                           );
      

      比起not in,我更喜欢not exists,因为它们处理NULLs 的方式不同。如果子查询选择了一个 NULL 值,NOT IN 将永远不会返回 true。

      【讨论】:

      • 您能否详细说明NULL 的处理方式有何不同?谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多