Получение ошибки «Ошибка компиляции SQL: неподдерживаемый тип подзапроса не может быть оценен» - PullRequest
1 голос
/ 01 ноября 2019

Я новичок в программировании на Snowflake, хотя у меня большой опыт работы с БД Oracle.

Когда я выполняю приведенный ниже запрос в 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);

Я что-то здесь упускаю ??

Может ли кто-нибудь мне помочь, пожалуйста, здесь.

Заранее спасибо, Sudarshan

Ответы [ 3 ]

3 голосов
/ 01 ноября 2019

Похоже, вы хотите последнюю версию с последней даты вступления в силу. Оконные функции, вероятно, лучше подходят для любой базы данных:

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 голос
/ 01 ноября 2019

База данных Snowflake не поддерживает коррелированные подзапросы так широко, как Oracle.
Вы должны найти способ переписать, например. используя

WITH <common table expressions ...>
SELECT ...
JOIN ...
0 голосов
/ 04 ноября 2019

Я выяснил, что третье условие соединения в последнем подзапросе вызывает эту ошибку. Если мы закомментируем следующую строку, то код вернет данные:

{AND ir3.effectivity_date = mir.effectivity_date}

Таким образом, кажется, что три условия соединения в подзапросе не поддерживаются,Нам нужно потрудиться над поиском альтернативного фрагмента кода, удовлетворяющего указанному выше условию, чтобы мы получили правильный набор результатов.

...