在 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 操作中使用相关子查询(UNIONINTERSECTEXCEPTMINUS)。

您不能在具有GROUP BYHAVING 子句的聚合中使用相关子查询。 您不能在 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 的嵌套查询中无法访问外部表的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 select 语句查询数据得到 ORA-22905:无法访问非嵌套表项中的行

使用外部表逻辑在 netezza 中加载数据时出错

为啥外部表在 netezza 中不起作用?

Netezza 外部表数据对象

netezza:无法识别功能

HiveContext - 无法访问在 hive 中映射为外部表的 hbase 表