SQL查询错误(不支持与跳过级别相关的相关子查询)

时间:2016-04-07 08:11:36

标签: sql postgresql greenplum

我有一个以下运行的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)

我该如何修改查询?

3 个答案:

答案 0 :(得分:0)

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

  1. T1
  2. T2
  3. 您可以使用“t2子查询”中的t(查询其中t2在FROM子句中),您可以在“t子查询”中使用t1。但是你不能使用“t2子查询”中的t1。

    修复可能是使用WHERE t2.id = t.id)) as avgdur

    此处的一些信息:http://www.greenplumdba.com/correlated-subqueries-csqs-in-greenplum

答案 1 :(得分:0)

在我看来,你只是想以不同的方式做一个小组...

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

答案 2 :(得分:0)

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

set optimizer = on;

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

请告诉我这是否有帮助!