带有内部查询的 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 插入语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章