#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
используется). Подзапросы вообще не нужны.