收到错误“ SQL编译错误:无法评估不支持的子查询类型”

时间:2019-11-01 06:53:54

标签: sql oracle snowflake-data-warehouse

尽管我在Oracle DB方面有很多经验,但对Snowflake编程还是陌生的。

在Snowflake中运行以下查询时,出现错误

  

SQL编译错误:无法评估不受支持的子查询类型

SELECT organization_id,
       inventory_item_id,
       revision,
       effectivity_date,
       revision_label,
       revision_id
  FROM cg1_mtl_item_revisions_b mir
 WHERE     effectivity_date IN
              (SELECT FIRST_VALUE (ir2.effectivity_date)
                         OVER (ORDER BY ir2.effectivity_date DESC)
                         effectivity_date
                 FROM cg1_mtl_item_revisions_b ir2
                WHERE     ir2.inventory_item_id = mir.inventory_item_id
                      AND ir2.organization_id = mir.organization_id
                      AND ir2.effectivity_date <= CURRENT_DATE
                      AND ir2.implementation_date IS NOT NULL)
       AND mir.revision IN
              (SELECT FIRST_VALUE (ir3.revision)
                         OVER (ORDER BY ir3.revision DESC)
                         revision
                 FROM cg1_mtl_item_revisions_b ir3
                WHERE     ir3.inventory_item_id = mir.inventory_item_id
                      AND ir3.organization_id = mir.organization_id
                      AND ir3.implementation_date IS NOT NULL
                      AND ir3.effectivity_date = mir.effectivity_date);

我在这里想念东西吗?

有人可以在这里帮助我吗?

预先感谢, 苏达山

3 个答案:

答案 0 :(得分:3)

您似乎想要从最近的生效日期起的最新版本。在任何数据库中,窗口函数可能是更好的方法:

SELECT mir.*  -- whatever columns you want
FROM (SELECT mir.*,
             ROW_NUMBER() OVER (PARTITION BY mir.inventory_item_id, mir.organization_id
                                ORDER BY mir.effectivity_date DESC, mir.revision DESC) as seqnum
      FROM cg1_mtl_item_revisions_b mir
     ) mir
WHERE seqnum = 1;

答案 1 :(得分:1)

Snowflake数据库不像Oracle那样广泛地支持关联子查询。
您必须找到一种重写方法,例如使用

WITH <common table expressions ...>
SELECT ...
JOIN ...

答案 2 :(得分:0)

我发现最后一个子查询中联接的第三个条件是抛出此错误。如果我们注释掉以下行,那么代码将返回数据:

{AND ir3.effectivity_date = mir.effectivity_date}

因此,似乎不支持子查询中的三个联接条件。 我们需要找到满足以上条件的替代代码,以便获得正确的结果集。