Промежуточные таблицы для запроса SQL

#sql #oracle

#sql #Oracle

Вопрос:

Чтобы устранить проблему с производительностью, я переработал запрос следующим образом:

 SELECT
    G.line_item_id
    , G.price
FROM
    mn_price_master_li G
    , (
        Select
            max ( G_ED.date_impl ) as "mximpl"
            , max ( G_ED.eff_start_date ) as "mxeff"
            , G_ED.line_item_id as "Id"
        FROM
            mn_price_master_li G_ED
        WHERE
            G_ED.line_item_id = '6314925' OR G_ED.line_item_id = '908200'
        GROUP BY
            G_ED.line_item_id 
    ) G_EF
WHERE
    G.line_item_id = G_EF.Id
    AND G.date_impl = G_EF.mximpl
    AND G.eff_start_date = G_EF.mxeff
  

Однако, похоже, что Oracle это не нравится…

ORA-00904: "G_EF"."MXEFF": invalid identifier

Но когда я делаю это…

 SELECT
    G_EF.*
FROM
    (
        Select
            max ( G_ED.date_impl ) as "mximpl"
            , max ( G_ED.eff_start_date ) as "mxeff"
            , G_ED.line_item_id as "Id"
        FROM
            mn_price_master_li G_ED
        WHERE
            G_ED.line_item_id = '6314925' OR G_ED.line_item_id = '908200'
        GROUP BY
            G_ED.line_item_id 
    ) G_EF
  

Он возвращает мне ожидаемую таблицу.

Почему я не могу выбрать поля, определенные в G_EF, и как мне это исправить?

Комментарии:

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

2. "mxeff" и mxeff это две разные вещи.

Ответ №1:

В Oracle это "mxeff" приводит к названию столбца в нижнем регистре.

Отбросьте кавычки и запустите заново…

в противном случае вы должны ссылаться на столбец таким же образом

 AND G.eff_start_date = G_EF."mxeff"
  

Ответ №2:

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

 SELECT G.line_item_id,
       MAX(G.price) KEEP (DENSE_RANK FIRST ORDER BY eff_start_date DESC, date_impl DESC) as price
FROM mn_price_master_li G
WHERE G_ED.line_item_id IN ('6314925', '908200')
GROUP BY G.line_item_id;
  

Если не это, то что-то подобное (не ясно, для чего date_impl используется). Подзапросы вообще не нужны.