powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка по MAX(ID) без подзапроса
9 сообщений из 9, страница 1 из 1
Выборка по MAX(ID) без подзапроса
    #39376189
gister
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! есть запрос
Код: plsql
1.
2.
3.
4.
5.
6.
select  * 
    from U_T_WAYBILL t
    where
     t.DREG = trunc(SYSDATE)
     and ID = (select MAX(ID) from U_T_WAYBILL)
     and exists(select 1 from U_T_WAYBILLDTL dt where t.ID = dt.ID and t.DEP_ID = dt.DEP_ID and (dt.DEP_ID_FR = 19460 or dt.DEP_ID_TO = 19460)) 


каким образом можно осуществить выборку по
Код: plsql
1.
MAX(ID) 

без подзапроса
Код: plsql
1.
(select MAX(ID) from U_T_WAYBILL)

?
...
Рейтинг: 0 / 0
Выборка по MAX(ID) без подзапроса
    #39376193
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gister,

а чем тебя не устраивает подзапрос?)
...
Рейтинг: 0 / 0
Выборка по MAX(ID) без подзапроса
    #39376199
gister
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень медленно работает, раньше использовал выборку по MAX без подзапроса, но сейчас забыл реализацию. Напомните, пожалуйста, кто знает!?
...
Рейтинг: 0 / 0
Выборка по MAX(ID) без подзапроса
    #39376207
Alexls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gister,

А что мешает вынести подзапрос в with + использовать result cache?
...
Рейтинг: 0 / 0
Выборка по MAX(ID) без подзапроса
    #39376210
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gister,

Ок. Если U_T_* это таблица то как раз таки ID = (MAX(ID)) должно отрабатывать быстрее за счет индекс скана (индекс же есть на ID?).

Без подзапроса можно обойтись аналитикой, но в большинстве случаев это не будет быстрее.

Код: plsql
1.
2.
3.
SELECT * FROM (
SELECT ID, MAX(ID) OVER () mx_id FROM table) s
WHERE ID = mx_id; 




Вообще смотреть нужно план, на что тратиться время /*+gather_plan_statistics*/. Оптимально он должен выглядеть как индексный доступ в U_T_WAYBILL и NL на exist () подзапрос.
...
Рейтинг: 0 / 0
Выборка по MAX(ID) без подзапроса
    #39376257
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При наличии индекса на id
Код: plsql
1.
2.
3.
4.
with u_t_waybill as (select level id from dual connect by level <= 100)
select *
from u_t_waybill t1, (select max(id) max_id from u_t_waybill) t2
where t1.id = t2.max_id;
...
Рейтинг: 0 / 0
Выборка по MAX(ID) без подзапроса
    #39376949
gisterДобрый день! есть запрос
Код: plsql
1.
2.
3.
4.
5.
6.
select  * 
    from U_T_WAYBILL t
    where
     t.DREG = trunc(SYSDATE)
     and ID = (select MAX(ID) from U_T_WAYBILL)
     and exists(select 1 from U_T_WAYBILLDTL dt where t.ID = dt.ID and t.DEP_ID = dt.DEP_ID and (dt.DEP_ID_FR = 19460 or dt.DEP_ID_TO = 19460)) 





Код: plsql
1.
2.
3.
4.
5.
select  MAX(ID)
    from U_T_WAYBILL t
    where
     t.DREG = trunc(SYSDATE)
     and exists(select 1 from U_T_WAYBILLDTL dt where t.ID = dt.ID and t.DEP_ID = dt.DEP_ID and (dt.DEP_ID_FR = 19460 or dt.DEP_ID_TO = 19460)) 


?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Выборка по MAX(ID) без подзапроса
    #39614311
3454656565
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gister,
А автор наверное видел запросы с использованием хинта по индексу (а тут у тебя первичный ключ) типа

Код: sql
1.
select /*+ index_desc (t pk_table) */ * from table t where rownum=1

тут будет выборка максимальной записи в первичном ключе при условии, что это первое поле в индексе.

Но тебе сие не поможет, так как у тебя ID это второе поле индекса по первичному ключу, но чтобы работало быстро и равномерно , то достаточно
Код: plsql
1.
2.
3.
4.
5.
6.
select  * 
    from U_T_WAYBILL t
    where
     t.DREG = trunc(SYSDATE)
     and ID = (select MAX(ID) from U_T_WAYBILL where DREG = trunc(SYSDATE))
     and exists(select 1 from U_T_WAYBILLDTL dt where t.ID = dt.ID and t.DEP_ID = dt.DEP_ID and (dt.DEP_ID_FR = 19460 or dt.DEP_ID_TO = 19460)) 



потому что у тебя табличка проиндексирована по полю DREG!
Хотя есть шанс, что проблемы в логике, так как непонятно зачем нужен максимальный ID, но это можно поинтересоваться у Федора З. - нет ли тут ошибки в логике.
...
Рейтинг: 0 / 0
Выборка по MAX(ID) без подзапроса
    #39614317
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3454656565но это можно поинтересоваться у Федора З.Корпоративные средства общения отсутствуют, гробокопатель?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка по MAX(ID) без подзапроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]