将相关子查询转换为连接

时间:2016-02-17 14:03:58

标签: sql netezza correlated-subquery

我想表达一下:

SELECT
    a.*
    ,b.timestamp_col
FROM weird_data_source a
LEFT JOIN weird_data_source b
ON a.id = b.id
    AND b.timestamp_col = (
        SELECT
            MAX(sub.timestamp_col)
        FROM weird_data_source sub
        WHERE sub.id = a.id
            AND sub.date_col <= a.date_col
            AND sub.timestamp_col < a.timestamp_col
    )

这里有一些关于数据的说明:

  1. date_coltimestamp_col不代表同一件事。
  2. 我不是在开玩笑......数据真的是这样的结构。
  3. 但子查询无效。 Netezza无法处理相关子查询中的<运算符。对于我的生活,我无法找到另一种选择。我怎么能绕过这个?

    我的直觉告诉我这可能是通过加入完成的,但我还未能成功。

    有十几个类似的问题,但似乎没有人能够处理这种不平等。

1 个答案:

答案 0 :(得分:1)

这应该让你非常接近。如果有两行完全相同的timestamp_col符合条件,那么您将获得重复的行,否则您应该是好的:

SELECT
    a.id,
    a.some_other_columns,    -- Because we NEVER use SELECT *
    b.timestamp_col
FROM
    weird_data_source a
LEFT JOIN weird_data_source b ON
    a.id = b.id
LEFT OUTER JOIN weird_data_source c ON
    c.id = a.id AND
    c.date_col <= a.date_col AND
    c.timestamp_col < a.timestamp_col
LEFT OUTER JOIN weird_data_source d ON
    d.id = a.id AND
    d.date_col <= a.date_col AND
    d.timestamp_col < a.timestamp_col AND
    d.timestamp_col > c.timestamp_col
WHERE
    d.id IS NULL

该查询基本上是在寻找一个匹配的行,其中没有找到其他匹配的行具有更大的timestamp_col值 - 因此d.id IS NULL。如果找不到匹配项,该列只会是NULL