【问题标题】:Are multiple correlated queries unsupported in Netezza?Netezza 是否不支持多个相关查询?
【发布时间】:2015-04-02 12:03:39
【问题描述】:

这可能先用代码更容易解​​释,所以我目前使用的是这样的:

'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 

我觉得解决这个问题的唯一方法是进行某种连接,但我不确定如何在不产生大量重复的情况下做到这一点。有什么建议吗?

【问题讨论】:

  • 联合而不是加入? (不会导致任何重复。)
  • @jarlh:这可以防止完全重复,但不能部分匹配(在我的情况下,特定记录具有 'A''S'b.col1)。
  • 可能有更好的方法来编写这个查询。考虑用样本数据和期望的结果提出另一个问题——描述你真正想做的事情。如果您的查询确实很复杂,请尝试将其简化以专注于这方面。
  • @GordonLinoff:我可以这样做,但这不能回答我提出的问题。

标签: sql netezza correlated-subquery ansi-sql


【解决方案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,但我需要先查看查询结构的平衡,然后才能确定可能是什么。

【讨论】:

  • 这足以回答这个问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多