01.06.2007 13:18
Pyatak
 
Возможно ли и как выбрать только определенные строки запроса?
Например запрос:
SELECT * FROM table;
из результатов этого запроса, допустим, мне нужны только строки с 10-ой по 20-ую.
пробовал так: SELECT * FROM table WHERE rownum BETWEEN 10 and 20;
не работает, такая конструкция работает, только если нужно ограничить номер строки снизу (например, rownum<20).
Выборку по ключевым полям таблицы не рассматриваем.
Версия Oracle: 9.2.0.7.0
01.06.2007 13:36
OlegON
 
По моему нарушена логика приложения. Зачем это нужно?
Первое же, что пришло в голову, но неоптимальное это:
Цитата:
select * from supermag.sssysinfo where rownum<5
minus
select * from supermag.sssysinfo where rownum<2
01.06.2007 13:44
kadr
 
Цитата:
OlegON По моему нарушена логика приложения. Зачем это нужно?
Первое же, что пришло в голову, но неоптимальное это:
присоединяюсь к предыдущему "оратору", вот мой варинат
Код:
SELECT * FROM (
SELECT ROWNUM AS rown, s.* FROM smspec s)
WHERE rown BETWEEN 10 AND 20
01.06.2007 13:46
Mtirt
 
Угу. Всё это хорошо, только выборка будет разная при изменении сортировки данных.
Лучше строить отбор по ключевым полям, потом ограничивая выборку по количеству записей...
01.06.2007 14:00
kadr
 
Изначально было
Код:
SELECT * FROM table;
от этого и пляшем.
Ведь
Цитата:
Выборку по ключевым полям таблицы не рассматриваем
01.06.2007 14:13
Mtirt
 
Kadr, я не про условия задачи. Они понятны.
Я про то, что строить какие-либо приложения на таких запросах, может привести к серьезным негативным последствиям.
01.06.2007 14:34
Pyatak
 
Дело в том, что программе нужно просмотреть ВСЕ записи некоторых таблиц, причем заранее не известно что это за таблицы и какие есть в них поля. Когда программе указывают таблицу, она строит запрос SELECT * FROM table; где вместо table подставляет нужное имя, выполняет его и начинает просматривать записи. Эта программа пишется на Delphi с использованием компонентов ADO. А в них, если выполняется такой запрос, то все его данные сразу начинают копироваться в локальную память, которой для некоторых таблиц просто не хватает, вот и хотелось запрос по частям обрабатывать. Может будут другие предложения? Просто мне до сих пор на более низком уровне БД программировать не приходилось.
01.06.2007 14:44
Mtirt
 
По идее должно помочь вот это:

Ну и еще предложение поискать более быстрые компоненты доступа к базе, чем ADO.
Например DOA или ODAС.
01.06.2007 15:21
Pyatak
 
Ага, помогло, спасибо.
Я б перешел на что-нибудь другое, но мне приходится писать мало и быстро, в некоторых случаях для разового использования, так что нет смысла, ADO справляется (до сих пор покрайней мере :))
01.06.2007 20:55
OlegON
 
Цитата:
Pyatak ...Эта программа пишется на Delphi с использованием компонентов ADO. А в них, если выполняется такой запрос, то все его данные сразу начинают копироваться в локальную память, которой для некоторых таблиц просто не хватает, вот и хотелось запрос по частям обрабатывать. Может будут другие предложения? Просто мне до сих пор на более низком уровне БД программировать не приходилось.
ADO - универсальный костыль. Если не хочешь получить гору геморроя и глюков - сверни на более правильные компоненты на базе OCI, например те, что упомянула MTirt, если бесплатные, то на том же torry.net валяется Atom. Все нормально работает, кое-где есть буфферизация. Если хочешь просмотреть гигантскую таблицу именно списком, то рекомендую залезть в Дельфи поглубже на тему virtual listbox, например. В 9ке Оракла есть реверс просмотра, можно его использовать.
Что касается ADO, то будет прекрасный момент, когда надо будет мало и быстро, но глючность ADO тебя подведет. Я тоже не много пишу, но поверь, универсальность ADO вовсе не придает скорости разработке. В компонентах же часто встречаются вкусности вроде того же построения списка баз.
Часовой пояс GMT +3, время: 12:26.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.