【问题标题】:Netezza correlated queryNetezza 相关查询
【发布时间】:2015-01-28 12:38:32
【问题描述】:

我正在从 Sybase 迁移到 Netezza,而 Netezza 不支持这种类型的查询。有人可以告诉我如何重写它吗?

UPDATE table1 t1 
SET t1.col1=t2.col1
FROM table2 t2
WHERE t1.col2=t2.col2
AND t2.col3=(SELECT MAX(t3.col3) FROM table2 t3 WHERE t3.col2=t1.col2);

【问题讨论】:

    标签: sybase netezza correlated-subquery


    【解决方案1】:

    这种相关的子查询实际上可以在 Netezza 中使用,具体取决于您的版本。

    我碰巧运行的是 7.2,它运行良好。

    [nz@netezza ~]$ nzrev
    Release 7.2.0.3 [Build 42210]
    [nz@netezza ~]$ k^C
    [nz@netezza ~]$ set -o vi
    [nz@netezza ~]$ nzsql -d testdb
    Welcome to nzsql, the IBM Netezza SQL interactive terminal.
    
    Type:  \h for help with SQL commands
           \? for help on internal slash commands
           \g or terminate with semicolon to execute query
           \q to quit
    TESTDB.ADMIN(ADMIN)=> UPDATE table1 t1
    TESTDB.ADMIN(ADMIN)-> SET t1.col1=t2.col1
    TESTDB.ADMIN(ADMIN)-> FROM table2 t2
    TESTDB.ADMIN(ADMIN)-> WHERE t1.col2=t2.col2
    TESTDB.ADMIN(ADMIN)-> AND t2.col3=(SELECT MAX(t3.col3) FROM table2 t3 WHERE t3.col2=t1.col2);
    UPDATE 1
    TESTDB.ADMIN(ADMIN)=>
    

    不过,较新的版本(7.1 之前的版本)无法处理这个问题。以下是如何将特定情况重写为连接而不是相关子查询。

    UPDATE table1 t1
    SET t1.col1=t2.col1
    FROM table2 t2,
       (
          SELECT col2,
             MAX(col3) col3
          FROM table2
          GROUP BY col2
       )
       t3
    WHERE t1.col2 = t2.col2
    AND t2.col2  = t3.col2
    AND t2.col3  = t3.col3;
    

    documentation for v7.2.0 对相关子查询支持有这样的说法。

    如果您选择使用关联子查询,请记住以下几点 对相关子查询的形式和位置的限制:

    您可以在 WHERE 子句中使用相关子查询。

    您可以在内部连接条件和相等连接条件运算符中使用相关子查询。

    您只能以下列形式在混合相关表达式中使用相关子查询:

        expr(corr_columA, corr_columnB,...) = expr(local_columnX, local_columnY,...)
    

    您不能在 SET 操作(UNION、INTERSECT、EXCEPT 和 MINUS)中使用相关子查询。

    您不能在具有 GROUP BY 和 HAVING 子句的聚合中使用相关子查询。

    您不能在 ORed 子句或 CASE/WHEN 表达式中使用相关子查询。

    您不能在 IN 列表中使用相关子查询。您不能在 SELECT 列表中使用相关子查询。

    【讨论】:

    • 我正在使用的版本是 6.0 似乎很旧。我对这些相关的子查询有很多麻烦。更新到最新版本会解决这些相关类型的问题吗?
    • 在最近的版本中,对相关子查询的支持要好得多。我不能说它会解决所有问题,但它涵盖了我遇到的很多情况。更新我的答案以包括文档中的一些详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2016-12-06
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多