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 查询错误(不支持具有跳过级相关性的相关子查询)的主要内容,如果未能解决你的问题,请参考以下文章