Netezza 相关查询



我正在从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);

这种相关的子查询实际上可以在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;

v7.2.0 的文档对相关子查询支持进行了说明。

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

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

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

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

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

不能在 SET 操作(联合、相交、例外和减号)中使用相关子查询。

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

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

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

相关内容

  • 没有找到相关文章

最新更新