2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Быстро найти последнюю строку в запросе
Сообщение11.02.2010, 12:57 
Заслуженный участник


08/04/08
8519
Регулярно сталкиваюсь с такой проблемой. Есть некоторая таблица, есть поле F в этой таблице, по которым есть индекс и есть значения этих полей. Запрос из этой таблицы по этим полям F возвращает в общем случае несколько строк (порядка 1-10), у каждой строки есть идентификатор ID. Надо выбрать из этих нескольских строк строку с максимальным ID (по ID как по PK, ессно, есть индекс).
Понятно, что если бы у меня был только этот запрос, то проблемы нет - сортируешь по индексу или используешь конструкцию where ID = (select max(ID)). Но мне необходимо находить последние строки внутри подзапросов какого-то большого запроса. Из-за этого запросы начинают ощутимо тормозить. Наконец сам код для выбора последней строки (как с указанием индекса, там и с select max(ID)) выглядит слишком громоздко.
Есть ли какой-нибудь более приличный способ выбора последней строки запроса? Очень надо. Желательно, чтобы он выглядел тоже прилично.

 Профиль  
                  
 
 Re: Быстро найти последнюю строку в запросе
Сообщение11.02.2010, 13:46 
Аватара пользователя


25/03/09
94
Код:
select top(1) a,b,c,d from ... where ... order by ID desc

Так, например, можно.

 Профиль  
                  
 
 Re: Быстро найти последнюю строку в запросе
Сообщение11.02.2010, 14:02 
Заслуженный участник


08/04/08
8519
конструкция order by видимо не подходит. Например запрос
Код:
select
  (select ID from TABLE where rownum = 1 order by ID desc) as ID
from dual

компилятор уже не понимает - матерится.

 Профиль  
                  
 
 Re: Быстро найти последнюю строку в запросе
Сообщение11.02.2010, 14:13 
Аватара пользователя


25/03/09
94
Sonic86 в сообщении #287146 писал(а):
конструкция order by видимо не подходит. Например запрос
Код:
select
  (select ID from TABLE where rownum = 1 order by ID desc) as ID
from dual

компилятор уже не понимает - матерится.

Мой MS-SQL поругался так: The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
Т.е. он хочет top(1), вот такое работает:
Код:
select
  (select top(1) ID from TABLE where rownum = 1 order by ID desc) as ID
from dual


Eсли rownum - это функция, возвращающая номер строки, то ее тут писать не нужно, такого достаточно:
Код:
select
  (select top(1) ID from TABLE order by ID desc) as ID
from dual

 Профиль  
                  
 
 Re: Быстро найти последнюю строку в запросе
Сообщение11.02.2010, 15:10 
Заслуженный участник


08/04/08
8519
Блин, а у меня Oracle и кажется версия 8.
Мне компилятор пишет missing right parentities, видимо в том смысле, что он не мыслит себе order by внутри некоторого подзапроса.
А вообще да, код хорошо выглядит и может быть работает хорошо.

rownum - это да, номер строки.

 Профиль  
                  
 
 Re: Быстро найти последнюю строку в запросе
Сообщение11.02.2010, 15:37 
Аватара пользователя


25/03/09
94
Про Oracle не знаю, почему-то думал, там есть top. Как вариант, select max(id) from ... where rownum=1 order by id desc, но как-то уже не очень красиво.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: maxal, Toucan, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group