我正在从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);
答案 0 :(得分:2)
这种相关的子查询实际上可以在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列表中使用相关子查询。