我试图使用包含子查询的查询填充表。
格式如下:
INSERT INTO table_C
SELECT columns FROM table_A, table_B子查询出现在select语句的一个列中,它再次引用" table_A“(table_A和table_B之间有一个连接)。
下面是代码,但在阅读代码之前,请考虑一下,如果单独运行select语句(即不插入),则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,State: XX000亚马逊无效操作:由于内部错误,不支持这种关联子查询模式;
发布于 2016-07-12 09:06:48
我没有任何解决方案要提出,但有一个答案,解释为什么你有这个错误。
在RedShift上,有几种情况下,优化器无法解析相关的子查询并触发此错误。其中之一恰恰是你的疑问:
不支持的相关子查询模式 查询规划器使用名为子查询解相关的查询重写方法来优化多个相关子查询的模式,以便在MPP环境中执行。有几种类型的相关子查询遵循Amazon无法修饰和不支持的模式。包含以下相关引用的查询返回错误: 按列对相关子查询结果的引用。例如: 选择listing.listid,(从sales.listid=listing.listid的销售中选择count (sales.listid)作为上市组的列表,listing.listid;
在子查询中:
(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请注意,如果没有其他人这样做,我稍后可能会更深入地查看您的查询,以便提出一个替代方案。现在没时间了。
https://stackoverflow.com/questions/38323805
复制相似问题