【问题标题】:Correlated-subquery in INSERT statement - PostgreSQLINSERT 语句中的相关子查询 - PostgreSQL
【发布时间】:2016-11-14 09:30:13
【问题描述】:

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

格式如下:

INSERT INTO table_C 
SELECT columns FROM table_A, table_B

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

这是代码,但在阅读之前请考虑 select 语句如果单独运行(即没有 INSERT)完美运行:

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] 亚马逊无效操作: 不支持这种类型的相关子查询模式,因为 内部错误;

【问题讨论】:

  • 由于 Redshift 是 PostgreSQL 的一个闭源分支,你或许应该问问亚马逊。一定是他们的一些代码。

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


【解决方案1】:

我没有建议的解决方案,但可以解释为什么您会出现此错误。

在 RedShift 上,有几种情况优化器无法解析相关子查询并触发此错误。其中之一正是您的 suquery:

不支持的相关子查询模式

查询计划器使用称为子查询的查询重写方法 去相关以优化相关子查询的几种模式 用于在 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多