У меня есть sql using Oracle SQL Developer ниже, который работает, но меня беспокоит производительность над большей живой базой данных.Оптимизация SQL-запроса в where where
Извините за все таблицы соединений, это показывает соединения с таблицей _aud и ревизионной таблицей, которая хранит историю аудита.
select cust.forename, cust.surname
from customer cust
join section_details sd on cust.section = sd.section
where
-- this value is substituted programatically
sd.type = 5 and
(
(select max(rt.timestamp)
from
customer cust_tmp1
join section_details sd on cust_tmp1.section = sd.section
join measure msr on sd.measure = msr.id
join measure_aud msr_a on msr.id = msr_a.id
join revision_table rt on msr_a.rev = rt.id
where
cust_tmp1.id = cust.id and msr.measure = 'Last Contact Date')
>
(select max(rt.timestamp)
from
customer cust_tmp2
join section_details sd on cust_tmp2.section = sd.section
join measure msr on sd.measure = msr.id
join measure_aud msr_a on msr.id = msr_a.id
join revision_table rt on msr_a.rev = rt.id
where
cust_tmp2.id = cust.id and msr.measure = 'Last Order Date')
);
Короче говоря, я только хочу, чтобы получить сведения о клиенте, если «последний контакт Date» более поздняя, чем «дату последнего заказа». Я заканчиваю тем, что максимальная отметка (временная метка) из одного выбора больше, чем максимальная (временная метка) из другого выбора.
Все работает отлично, и я получаю ожидаемые результаты.
Каждая сторона сравнения временной метки дублируется отдельно от msr.measure = 'Last Contact Date' или 'Last Order Date'.
Я пробовал несколько альтернатив, которые никогда не работали, поскольку они приводили к многоуровневым вложенным подзапросам, и я не мог пройти во внешней записи cust.
Любые дальнейшие идеи были бы весьма признательны.
Пожалуйста, отметьте свой вопрос в базе данных, которую вы используете. –
Я пометил oracle11g и обновил свой вопрос. Спасибо за ответы, я попробую их обоих в ближайшее время, если я смогу или первым делом завтра и обновить здесь. –