INSERT语句中的相关子查询 - PostgreSQL

时间:2016-07-12 08:37:41

标签: sql sql-insert amazon-redshift correlated-subquery

我正在尝试使用包含子查询的查询来填充表。

格式如下:

INSERT INTO table_C 
SELECT columns FROM table_A, table_B

子查询存在于select语句的一列中,它再次引用“table_A”(table_A和table_B之间存在连接)。

这是代码,但在阅读之前,请考虑如果单独运行(即没有INSERT),select语句可以正常工作:

INSERT INTO hypercube_2015 (date, hour, name, rel_val)
SELECT t1.date, t1.hour, t2.name,
        CAST(sum(t1.num) as float)/(SELECT sum(t11.num) FROM hc_num t11 WHERE t11.date = t1.date AND t11.hour = t1.hour)
FROM hc_num t1, names t2
        WHERE date between '2015-01-01' AND '2015-12-31'
        AND t1.id = t2.id
        GROUP BY t1.date, t1.hour, t2.name

问题与第3行中的子查询有关,特别是与WHERE条件有关。如果我把它改成以下它可以工作:

SELECT sum(t11.num) FROM hc_num t11 WHERE t11.date = '2015-01-01' AND t11.hour=0

错误消息是(我正在通过DBVis处理Redshift数据库):

  

[代码:500310,SQL状态:XX000]亚马逊无效操作:   由于这种类型的相关子查询模式不受支持   内部错误;

1 个答案:

答案 0 :(得分:0)

我没有提出任何解决方案,但答案解释了为什么会出现此错误。

在RedShift上,有几种情况下优化器无法解析相关子查询并触发此错误。其中一个恰恰就是你的问题:

  

不支持的相关子查询模式

     

查询规划器使用名为subquery的查询重写方法   去相关以优化几种相关子查询模式   在MPP环境中执行。几种类型的相关   子查询遵循Amazon Redshift无法解相关的模式   不支持。包含以下相关性的查询   引用返回错误:

     

在GROUP BY列中引用相关子查询的结果。例如:

select listing.listid,
(select count (sales.listid) from sales where sales.listid=listing.listid) as list
from listing
group by list, listing.listid;

来源:Amazon webservices Correlated Subqueries

在子查询中:

(SELECT sum(t11.num) FROM hc_num t11 WHERE t11.date = t1.date AND t11.hour = t1.hour)

您确实引用了最终t1.hour中出现的GROUP BY

GROUP BY t1.date, t1.hour, t2.name

请注意,如果没有其他人这样做,我可能会在以后更深入地查看您的查询以提出替代方案。现在没时间了。