我正在尝试使用包含子查询的查询来填充表。
格式如下:
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]亚马逊无效操作: 由于这种类型的相关子查询模式不受支持 内部错误;
答案 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
请注意,如果没有其他人这样做,我可能会在以后更深入地查看您的查询以提出替代方案。现在没时间了。