Netezza中是否不支持多个相关查询?

时间:2015-04-02 12:03:40

标签: sql netezza correlated-subquery ansi-sql

这可能更容易用代码解释,所以我现在使用的东西看起来像这样:

'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 

我有一种感觉,唯一的方法是做一些联接,但我不确定如何做到这一点,而不会产生大量的重复。有什么建议吗?

1 个答案:

答案 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,但我需要先了解查询结构的平衡,然后再尝试一下。