带有内部查询的 SQL 插入语句不起作用

Posted

技术标签:

【中文标题】带有内部查询的 SQL 插入语句不起作用【英文标题】:SQL Insert statement with inner query not working 【发布时间】:2019-04-12 11:09:26 【问题描述】:

AWS Redshift Table Delta Load Plan's Guidance继续

以下查询中给出的选择工作正常,并在阶段表中返回新插入:

SELECT A, B, C, D, E, F, G
      FROM TABLE_STAGE A
     WHERE NOT EXISTS (SELECT B.ID
                     FROM TABLE_FINAL B
                    WHERE B.B = A.B
                      AND B.C = A.C
                      AND B.D = A.D
                      AND B.E = A.E);

但是当我尝试使用以下语句将它们插入到最终表中时,它会失败:

INSERT INTO TABLE_FINAL values
(SELECT A, B, C, D, E, F, G
  FROM TABLE_STAGE A
 WHERE NOT EXISTS (SELECT B.ID
                 FROM TABLE_FINAL B
                WHERE B.B = A.B
                  AND B.C = A.C
                  AND B.D = A.D
                  AND B.E = A.E));

查询是否正确,只获取复合键是新的且最终表中不存在的那些行。如果这不是正确的解决方案,那么最有效的方法是什么。怎么做?

【问题讨论】:

代码怎么失败了? 第二个查询根本无效。如果您想使用 SELECT 作为 INSERT 的源,请删除 values 子句 我做到了,它奏效了。谢谢!您能否也请查看上一个查询(我已经给出了链接)并告诉我这是否是最好的方法? 【参考方案1】:

在进行插入时,您应该始终包含列列表:

INSERT INTO TABLE_FINAL (A, B, C, D, E, F, G)
    SELECT A, B, C, D, E, F, G
    FROM TABLE_STAGE A
    WHERE NOT EXISTS (SELECT B.ID
                      FROM TABLE_FINAL B
                      WHERE B.B = A.B AND
                            B.C = A.C AND
                            B.D = A.D AND
                            B.E = A.E
                     );

如果失败,最常见的原因是列中的类型不一致。也可能是您没有为声明为 not null 且没有默认值的列赋值。

【讨论】:

感谢您的回答。但是有没有更好的方法来完成这项对账工作?【参考方案2】:

试试这个:

INSERT INTO TABLE_FINAL 
SELECT A, B, C, D, E, F, G
  FROM TABLE_STAGE A
 WHERE NOT EXISTS (SELECT B.ID
                 FROM TABLE_FINAL B
                WHERE B.B = A.B
                  AND B.C = A.C
                  AND B.D = A.D
                  AND B.E = A.E);

【讨论】:

以上是关于带有内部查询的 SQL 插入语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server,临时表,SELECT 语句不起作用

在 JDBC 中为 SQL Query 插入单引号不起作用

mysql:内部查询在 selectif 语句中不起作用

为啥这个 IF NOT EXISTS 语句不起作用?

PL/SQL 语句的 SQL 查询不起作用

插入语句不起作用