这可能更容易用代码解释,所以我现在使用的东西看起来像这样:
'A' in
(
SELECT DISTINCT b.col1
FROM table b
WHERE b.ky1 = a.ky1
AND b.ky2 = a.ky2
AND b.group = a.group
AND b.rowNum < a.rowNum
)
在where子句中。本质上,我试图查看A是否是外部查询指定的行之前的任何点的值。这本身就是有效的。问题是我在查询中添加以下内容:
OR
'S' in
(
SELECT DISTINCT b.col1
FROM tableb b
WHERE b.ky1 = a.ky1
AND b.ky2 = a.ky2
AND b.group = a.group
AND b.rowNum < a.rowNum
)
现在,Netezza产生以下错误消息:
ERROR: (2) This form of correlated query is not supported - consider rewriting
我有一种感觉,唯一的方法是做一些联接,但我不确定如何做到这一点,而不会产生大量的重复。有什么建议吗?
答案 0 :(得分:1)
自版本7.2起,Netezza中的相关子查询具有以下使用注意事项,如文档here所述。
如果您选择使用相关子查询,请记住以下内容 对相关子查询的形式和位置的限制:
- 您可以在WHERE子句中使用相关子查询。
- 您可以在内连接条件和相等连接条件运算符中使用相关子查询。
您可以仅在以下格式中使用混合相关表达式中的相关子查询:
expr(corr_columA,corr_columnB,...)= expr(local_columnX, local_columnY,...)
你不能在SET操作中使用相关子查询(UNION,INTERSECT,EXCEPT和MINUS)。
- 您不能在GROUP BY和HAVING子句的聚合中使用相关子查询。
- 你不能在ORed子句或CASE / WHEN表达式中使用相关子查询。 ^ ===您在这里
- 您无法在IN列表中使用相关子查询。
- 您无法在SELECT列表中使用相关子查询。
如果将OR更改为AND,您将发现查询将运行。当然,并不是说它会产生你想要的结果。
您可以将其重写为JOIN,但我需要先了解查询结构的平衡,然后再尝试一下。