【问题标题】:SQL Insert statement with inner query not working带有内部查询的 SQL 插入语句不起作用
【发布时间】: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 子句
  • 我做到了,它奏效了。谢谢!您能否也请查看上一个查询(我已经给出了链接)并告诉我这是否是最好的方法?

标签: sql database amazon-redshift


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多