Страницы

Поиск по вопросам

вторник, 22 января 2019 г.

Упрощение sql запроса с подзапросами. Oracle

Здравствуйте. Нужно упростить запрос но пока что не как не могу понять как это сделать. Идея в том что бы все вложенные селекты переписать в джоины. ПОдскажит пожалуйста как это сделать. Вот мой запрос.
select weight from myTableData where port = (select port from myTableDict where Name = 'название') and date = ( select max(date) from myTableData where port = (select port from myTableDict where Name = 'название'));
Это пример моего запроса. Надеюсь всё расписал достаточно понятно. Если нет то пишите объясню. Нужно сделать вместо селектов вложенных, джоины не могу пока что понять как именно это сделать.
План запроса:
udp_port это port, w это myTableData, s это myTableDict. Собстенно в таблице WEIGHER_DATA, 31 милион записей с небольшим. На ней есть 2 индекса. На поле upd_port и на поле insert_date которое я подписал в примере как date. Стоимость запроса почти под 56 тысяч как по мне многовато. С этой информацией можно как то упростить и понизить стоимость запроса?


Ответ

select max(weight) keep (dense_rank last order by M.port,M.date) from myTableData M, myTableDict D where D.Name='название' and M.port=D.port
Конструкция KEEP дает значение поля weight для последней (dense_rank last) записи в порядке сортировки по дате. т.е. значение на максимальную дату. JOIN сокращен до запятой и параметры из ON перенесены в where.

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

Отправить комментарий