我有一个以下运行的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)
我该如何修改查询?
答案 0 :(得分:0)
你的问题在于WHERE t2.id = t1.id
。您可以在子查询中使用父级别的查询,但不能在较高级别使用查询。所以这里有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版本,该版本有一些改进和错误修复。
请告诉我这是否有帮助!