SQL 查询错误(不支持具有跳过级相关性的相关子查询)

Posted

技术标签:

【中文标题】SQL 查询错误(不支持具有跳过级相关性的相关子查询)【英文标题】:SQL query error (correlated subquery with skip-level correlations is not supported ) 【发布时间】:2016-04-07 08:11:36 【问题描述】:

我有以下运行的 sql 查询:

PostgreSQL 9.5.1,由 Visual C++ build 1800 编译,64 位

不是在:

x86_64-unknown-linux-gnu 上的 PostgreSQL 8.2.15(Greenplum Database 4.3.5.4 build 1),由 GCC gcc (GCC) 4.4.2 编译

SELECT id,
(SELECT AVG(dur)
    FROM data t
    WHERE t.id = t1.id AND 
        t.id IN (SELECT id 
                    FROM data t2
                    WHERE t2.id = t1.id
                    ORDER BY dur
                    DESC LIMIT 10)) as avgdur
FROM data t1 
WHERE t1.b<10000
ORDER BY avgdur 
DESC LIMIT 1;

我收到以下错误: 错误:不支持具有跳过级相关性的相关子查询 (subselect.c:394)

我应该如何修改查询?

【问题讨论】:

查看这些链接,它可能会有所帮助。 ***.com/questions/426221/… WHERE t2.id = t1.id)) as avgdur -->> WHERE t2.id = t.id)) as avgdur 不过查询大概可以简化一下。 【参考方案1】:

您的问题在于WHERE t2.id = t1.id。您可以在子查询中使用父级别的查询,但不能在更高级别使用。所以这里有 3 个级别:

    t1 t t2

您可以使用“t2 子查询”中的 t(查询 t2 在 FROM 子句中的位置),并且可以在“t 子查询”中使用 t1。但是您不能使用“t2 子查询”中的 t1。

解决办法是使用WHERE t2.id = t.id)) as avgdur

这里有一些信息:http://www.greenplumdba.com/correlated-subqueries-csqs-in-greenplum

【讨论】:

【参考方案2】:

在我看来,您只是想以不同的方式进行分组...

SELECT id, AVG(dur) as avgdur
FROM data t1 
WHERE t1.b<10000
GROUP BY id
ORDER BY avgdur 
DESC LIMIT 1;

【讨论】:

是的,但我必须做更多的事情,我只是简化了问题,我必须找到 5 个最大元素平均值为最大值的 id【参考方案3】:

Pivotal Query Optimizer(在 4.3.5 中可用)支持具有多级关联的查询。要启用 Pivotal 查询优化器,请运行以下命令。

设置优化器 =on;

我建议您升级到最新的 GPDB 版本 4.3.8,其中包含多项改进和错误修复。

如果这有帮助,请告诉我!

【讨论】:

以上是关于SQL 查询错误(不支持具有跳过级相关性的相关子查询)的主要内容,如果未能解决你的问题,请参考以下文章

具有不相等相关谓词的不支持的聚合子查询

基于mysql+php的英语四六级过级成绩管理

使用 SUM 过滤结果时,Google BigQuery 相关子查询错误

由于内部错误,不支持相关子查询模式 - 不存在相关子查询

SQL Presto:不支持相关子查询

重写相关子查询,Redshift 抛出这种类型的相关子查询模式尚不支持错误