我从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);发布于 2015-01-28 21:50:38
这种相关子查询实际上将在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;对于相关的子查询支持,7.2.0版本的文档有这样的说法。
如果选择使用关联子查询,请记住以下对相关子查询的形式和位置的限制: 您可以在WHERE子句中使用关联子查询。 您可以在内部联接条件中使用关联子查询,并使用相等的联接条件运算符。 只能以下列形式在混合关联表达式中使用关联子查询: (corr_columA,corr_columnB,.)= expr(local_columnX,local_columnY,.) 不能在SET操作中使用关联子查询(UNION、INTERSECT、operations和减号)。 不能在具有GROUP BY和with子句的聚合中使用关联子查询。 不能在ORed子句或CASE/WHEN表达式中使用关联子查询。 不能在in列表中使用相关子查询。不能在选择列表中使用相关子查询。
https://stackoverflow.com/questions/28192472
复制相似问题