Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как вытащить первые 10 записей? как вытащить первые 10 записей? 
:(
    Опции темы
Гость_Гость
Дата 27.5.2005, 16:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите с запросом .Надо вытащить первые 10 записей.


  Вверх
LSD
Дата 27.5.2005, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

Репутация: 18
Всего: 537



Код
select * from (select t.*, t.rownum from table t order by field1) where rownum<=N



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Kurt
Дата 29.5.2005, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



LSD
А нет че-нить более оптимального?
Как я понимаю, тут сначала делается запрос на выборку ВСЕХ данных из таблицы, а уж потом берутся первые 10 строк из полученного резалтсета.
А если исходначя таблица будет большой, а нам нужны жалкие 10 строчек? Ведь получается излишняя нагрузка на сервер?


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
<Spawn>
Дата 30.5.2005, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Kurt Смотри мой пример


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Kurt
Дата 30.5.2005, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



<Spawn>
Так это ж то же самое, что и пример LSD..
Точно так же сначала делается выборка ВСЕХ строк.


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
stron
Дата 30.5.2005, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



Kurt
А я себе другого варианта не представляю.
У тебя же есть условие where, поэтому тебе всё равно придётся бежать по всей таблице.
Причём этого не избежать, даже если использовать курсоры

Я бы вытаскивал записи так(Oracle не знаю, поэтому пишу под MsSQL):
Код

DECLARE @Name varchar(40)
DECLARE CT CURSOR FOR SELECT t1_data from t1 where t1_id > 8
OPEN CT
Declare @i int
set @i = 0
WHILE @i<10 
BEGIN
  FETCH FROM CT INTO @Name  
  set @i = @i + 1 
  print @Name
END
DEALLOCATE CT


А в Oracle есть аналоги LIMIT в MySQL? Если есть, так это надо использовать

Это сообщение отредактировал(а) stron - 30.5.2005, 14:35


--------------------
подписи нет
PM ICQ   Вверх
LSD
Дата 30.5.2005, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

Репутация: 18
Всего: 537



Цитата(Kurt @ 30.5.2005, 00:15)
LSD
А нет че-нить более оптимального?

Я ступил, тот запрос вообще работать будет некоректно, надо так:
Код
select * 
  from ( select a.*, rownum rnum
           from ( YOUR_QUERY_GOES_HERE, including the order by ) a
          where rownum <= MAX_ROWS )
 where rnum >= MIN_ROWS
/

Этот запрос вернет строки с MIN_ROWS по MAX_ROWS. Рекомендую посмотреть getting rows N through M of a result set.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Kurt
Дата 30.5.2005, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Цитата(LSD)
Я ступил, тот запрос вообще работать будет некоректно

Бывает:
Цитата(LSD)
--------------------
Каждый человек имеет право на "немного потупить".

smile

Но я все равно не совсем понимаю. Вот у меня есть таблица, скажем, на 4GB. Чтоб вытащить первые 10 строчек, я все равно сначала тяну всю таблицу? smile
Ведь в вышеописанных примерах сначала делается "общий запрос" (достать все данные), а уж потом из него выдергиваются нужные 10 строчек.
Неужели в такой крутой и общепризнанной базе нет такой очень полезной штуки?
Неужели нет аналога MySQL'евского LIMIT или Cache'йного TOP?


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
<Spawn>
Дата 31.5.2005, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Есть одна идея, но не знаю на сколько она реальна (и проверить нет возможности - на работе Oracle 8, дома 9-ка пока не стоит smile ) - насколько я помню, то есть функции итерпретации коллекции в виде таблицы, тогда тебе нужно будет написать функцию, возвращающую коллекцию записей(а на PL\SQL ты сам можешь на нужном fetch-е остановить выборку) и потом ее интерпретировать как таблицу в from части селекта.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
LSD
Дата 31.5.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

Репутация: 18
Всего: 537



Цитата(Kurt @ 31.5.2005, 00:02)
Но я все равно не совсем понимаю. Вот у меня есть таблица, скажем, на 4GB. Чтоб вытащить первые 10 строчек, я все равно сначала тяну всю таблицу?

Давайте не будем путать тянуть всю таблицу и просматривать всю таблицу. Во первых клиент получит только первые N записей, а во вторых какими порциями fetch-ить данные зависит от клиента и способа доступа к данным (в Java данные в ResultSet можно подкачивать по частям).
По поводу полного просмотра таблицы, если в подзапросе используется order by, то просмотра таблицы не избежать никак. Если поле не индексированное, то просмотр будет полным, если индексированное то будет полный просмотр индекса (во всяком случае такой план я получил на тестовой табличке). Стоимость запроса с order by по первичному ключу и по нениндексированному полю, различается в 3-4 раза.

Если же порядок не важен то можно использовать:
Код
select * from my_table where rownum <= MAX_ROWS

И полного просмотра не будет.
Добавлено @ 20:18
По поводу идеи <Spawn>, она реализуема. Но я не думаю, что открытие курсора по внутреннему запросу и fetch, будет быстрее, чем прямой SQL запрос на первые N строк. Хотя надо попробовать.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Stampede
Дата 31.5.2005, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: нет
Всего: 144



Цитата(Kurt @ 30.5.2005, 23:02)
Но я все равно не совсем понимаю. Вот у меня есть таблица, скажем, на 4GB. Чтоб вытащить первые 10 строчек, я все равно сначала тяну всю таблицу?


Не все так плохо. Оптимизатор оракла понимает, что мы хотим отсечь часть результатов, и строит план выполнения запроса таким образом, чтобы поскорее от нас отделаться smile Проверял неоднократно на различный типах запросов, в том числе с большими объемами данных. Работает нормально.

А то, что синтаксис получается неудобный - это да, есть такое дело. Более того, до версии 8i такая конструкция вообще была неозможна - оракл ругался на ORDER BY в подзапросе. В результате получалось, что мы только можем взять первые N записей (в каком уж там порядке они придут зависит от типа запроса), и уже внутри них отсортировать по нужному нам полю - что, разумеется, было не совсем то, что мы хотели получить.

Но только не надо на этом основании говорить, что оракыл сакс (хотя он, конечно, сакс). Просто у каждой СУБД есть свои тараканы. А что делать? Нет в мире совершенства smile


PM WWW   Вверх
rmaf
Дата 20.7.2005, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.7.2005

Репутация: нет
Всего: нет



Почитав ваши мнения, решил попробовать с этого:

select * from (select t.*, rownum from MONITOR t order by DATE_OPER) where rownum<=10

сделать это:

select t.*, rownum from MONITOR t where rownum<=10

результат одинаковый.

"Так зачем платить больше?"

или я чего-то не понимию?
PM MAIL   Вверх
LSD
Дата 20.7.2005, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

Репутация: 18
Всего: 537



Цитата(rmaf @ 20.7.2005, 13:05)
результат одинаковый.

"Так зачем платить больше?"

или я чего-то не понимию?

Результат будет разный, в первом случае вначале записи будут отсортированны, а только затем выбранны первые 10 строк. А во втором слечае вначале будут отобранны первые 10 строк (какие они будут неизвестно), а затем они будут отсортированны.

P.S. Для кода есть кнопочка "Код", используй ее, так код будет более читабельным.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
rmaf
Дата 20.7.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.7.2005

Репутация: нет
Всего: нет



Спасибо за пояснения...
Добавлено @ 14:08
LSD а можно ли как-то запросом узнать сколько и какие столбцы в таблице?
Это я так, под руку спрашиваю, вдруг ты знаешь...
PM MAIL   Вверх
LSD
Дата 20.7.2005, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

Репутация: 18
Всего: 537



Цитата(rmaf @ 20.7.2005, 15:03)
LSD а можно ли как-то запросом узнать сколько и какие столбцы в таблице?

Код
select * from all_tab_columns where owner = 'SYS' and table_name = 'DUAL'


Цитата(rmaf @ 20.7.2005, 15:03)
Это я так, под руку спрашиваю, вдруг ты знаешь...

По правилам форума:
Цитата
10) Запрещается создание сообщения с несколькими вопросами. На каждый вопрос должна создаваться отдельная тема. В случае возникновения таких тем, администрация форума оставляет за собой право изменить текст сообщения, удалить его или закрыть тему.

Если вопрос большой, лучше создать отдельную тему, а если вопрос маленький и была связанная тема, то лучше спросить в ней. В твоем случае здесь. А то придут модераторы и будут ругаться smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1440 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.