在 Netezza 的嵌套查询中无法访问外部表
Posted
技术标签:
【中文标题】在 Netezza 的嵌套查询中无法访问外部表【英文标题】:Outer table not accessible within nested query in Netezza 【发布时间】:2014-07-07 23:32:55 【问题描述】:在 Netezza 中,我尝试执行以下查询。我得到了错误:
ERROR [HY000] ERROR: (2) This form of correlated query is not supported - consider rewriting
这里是查询。它无法从B.path LIKE (A.path || '%') ESCAPE ''
行中的代码A.path
识别外部表“A”。
是否有另一种方法可以使逻辑正常工作?
我猜测,由于 Netezza 是比 SQL Server 或 Oracle 更新的 DBMS,它只是无法处理这样的嵌套逻辑。
SELECT
DISTINCT A.path,
(
SELECT
COUNT(DISTINCT NUM)
FROM
B
JOIN F ON B.id = F.fed_id
WHERE
B.path LIKE (A.path || '%') ESCAPE ''
AND
B.code IN ('c', 'C')
) as total_count
FROM
A
JOIN D ON D.path = A.path and D.code in ('c', 'C')
WHERE
A.code IN ('c', 'C')
编辑:
如果 IBM 链接被破坏,这里是链接中的注释。
http://www-01.ibm.com/support/knowledgecenter/SSULQD_7.0.3/com.ibm.nz.dbu.doc/c_dbuser_correlated_subqueries_ntz_sql.html?lang=en
Netezza SQL 中的相关子查询
IBM® Netezza® 支持常规子查询和相关子查询。每当 Netezza SQL 遇到常规子查询时,它都会预先计算一次子查询,如子查询中的示例。当系统在 WHERE 限制中遇到相关子查询时,它会在内部将它们转换为等效的连接格式,如相关子查询中的第二个示例。
如果您选择使用关联子查询,请记住以下对关联子查询的形式和位置的限制:
您可以在WHERE
子句中使用相关子查询。
您可以在 inner join
条件中使用相关子查询,并与等连接条件运算符一起使用。
您只能以下列形式在混合相关表达式中使用相关子查询:
expr(corr_columA, corr_columnB,...) = expr(local_columnX, local_columnY,...)
您不能在 SET 操作中使用相关子查询(UNION
、INTERSECT
、EXCEPT
和 MINUS
)。
GROUP BY
和HAVING
子句的聚合中使用相关子查询。
您不能在 ORed 子句或 CASE/WHEN
表达式中使用相关子查询。
您不能在 IN
列表中使用相关子查询。
您不能在 SELECT
列表中使用相关子查询。
注意:由于相关的子查询会极大地影响查询性能,因此请考虑将它们替换为连接,以获得更高效的代码。
【问题讨论】:
【参考方案1】:在不太了解 netezza 的情况下,这个重写的标准 SQL 查询应该可以完成这项工作:
SELECT A.path, COUNT(DISTINCT NUM) AS total_count
FROM A
JOIN D ON D.path = A.path
AND D.code IN ('c', 'C')
LEFT JOIN B ON B.path LIKE (A.path || '%') ESCAPE ''
AND B.code IN ('c', 'C')
LEFT JOIN F ON B.id = F.fed_id
WHERE A.code IN ('c', 'C')
GROUP BY A.path;
【讨论】:
现在祖先的数量加起来了!!谢谢!! www-01.ibm.com/support/knowledgecenter/SSULQD_7.0.3/…You cannot use correlated subqueries in SELECT lists.
这解释了它。相当多的限制...
Netezza 适用于数据仓库。它非常擅长批量插入和更新,但在其他方面缺乏功能。以上是关于在 Netezza 的嵌套查询中无法访问外部表的主要内容,如果未能解决你的问题,请参考以下文章