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

SQL query error (correlated subquery with skip-level correlations is not supported )

我有一个以下 sql 查询 运行 在:

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

不是在:

PostgreSQL 8.2.15(Greenplum 数据库 4.3.5.4 build 1)在 x86_64-unknown-linux-gnu 上,由 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)

我应该如何修改查询?

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

  1. t1
  2. t
  3. t2

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

中的 t1

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

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

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

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

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

设置优化器=开启;

我鼓励您升级到最新的 GPDB 版本 4.3.8,它有一些改进和错误修复。

如果有帮助请告诉我!