Помогите написать select!!!!!!!!!!!!11
есть таблица my_table(id,name,create_date)
нужно сделать запрос на все строки с 10 по 20
отсортировывая по дате
Я делаю вот как:
select mt.name
from
my_table mt,
(select v.id, rownum rn
from
(select id from my_table
order by create_date) v
) main_view
where
mt.id = main_view.id and
main_view.rn>10 and main_view.rn<20
это нерационально, т.к. в подselect'е выполняется
запрос на все содержимое таблицы, а нужно всего лишь
с 10 по 20.
заранее спасибо
Помогите написать "хороший" select
есть таблица my_table(id,name,create_date)
нужно сделать запрос на все строки с 10 по 20
отсортировывая по дате
заранее спасибо
описано не очень понятно, но судя по твоему примеру -
например:
select mt.name
from (select rownum N_ROW,my_table.*
from my_table) mt
where (mt.N_ROW>=10 and mt<=20)
ORDER BY mt.create_date
select mt.name
from (select rownum N_ROW,my_table.*
from my_table
where rownum<=20) mt
where (mt.N_ROW>=10 and mt.N_ROW<=20)
ORDER BY mt.create_date
так будет лучше:
select mt.name
from (select rownum N_ROW,my_table.*
from my_table
where rownum<=20) mt
where (mt.N_ROW>=10 and mt.N_ROW<=20)
ORDER BY mt.create_date
к сожалению это работать не будет (я так уже делал)
к примеру,
my_table --------- нам нужно выбрать с 1 по 2 строку
<name><create_date>
стул 10.09.03
стол 11.09.03
диван 13.09.03
когда ты выполняешь
(select rownum N_ROW,my_table.*
from my_table
where rownum<=2) mt
в mt будет
стул 10.09.03
стол 11.09.03
и как ты их не сортируй диван тут не окажеться,
хотя его дата создания самая свежая
здесь нужно как-то с индексами сделать вот только как?
а вот модернизировать твой запрос немного можно добавив условие: where rownum<=20
select mt.name
from my_table mt,
(select v.id, rownum rn
from (select id from my_table
order by create_date) v
where rownum<=20) main_view
where mt.id = main_view.id and
main_view.rn>10 and main_view.rn<20
а LIMIT чем не подходит ?
хм...
а LIMIT чем не подходит ?
а что такое LIMIT ?
а что такое LIMIT ?
Выражение LIMIT может использоваться для ограничения количества строк, возвращенных командой SELECT. LIMIT принимает один или два числовых аргумента. Эти аргументы должны быть целочисленными константами. Если заданы два аргумента, то первый указывает на начало первой возвращаемой строки, а второй задает максимальное количество возвращаемых строк. При этом смещение начальной строки равно 0 (не 1):
SELECT * FROM table LIMIT 5,10; # возвращает строки 6-15
Если твоя СУБД не поддерживает это... сочуствую :)
в принципе, это задача должна быть решена
с помощью индекса на столбце create_date
БД у меня Oracle
как только это сделать я не знаю X)-
Oracle не поддерживает LIMIT, задача решалась в правильном направлении - через rownum
Если решать задачу без индексов с rownum
в любои случае прийдется сделать
запрос ко всем строкам из таблицы,
потом их отсортировать, а уже дальше
делать выборку,
а это медленно :(
Помогите написать "хороший" select
есть таблица my_table(id,name,create_date)
нужно сделать запрос на все строки с 10 по 20
отсортировывая по дате
Я делаю вот как:
select mt.name
from
my_table mt,
(select v.id, rownum rn
from
(select id from my_table
order by create_date) v
) main_view
where
mt.id = main_view.id and
main_view.rn>10 and main_view.rn<20
это нерационально, т.к. в подselect'е выполняется
запрос на все содержимое таблицы, а нужно всего лишь
с 10 по 20.
заранее спасибо
Если не секрет - нафига такие сложности?
Всего навсего надо:
select mt.name
from
my_table mt,
where
mt.id in (select id from my_table where rownum <=10 and rownum >=20 order by create_date)
и все должно работать... Пройдет всего один селект в условии, в отличии от твоих двух вложенных, все отработает быстро и красиво...
Если не секрет - нафига такие сложности?
Всего навсего надо:
select mt.name
from
my_table mt,
where
mt.id in (select id from my_table where rownum <=10 and rownum >=20 order by create_date)
и все должно работать... Пройдет всего один селект в условии, в отличии от твоих двух вложенных, все отработает быстро и красиво...
сорри - посмотрел на всякий случай доку... так не получится... оракел не умеет так, как я написал... т.к. "вперед он смотреть не умеет"
Помогите написать "хороший" select
есть таблица my_table(id,name,create_date)
нужно сделать запрос на все строки с 10 по 20
отсортировывая по дате
заранее спасибо
В общем озадачился я этим делом :). Ларчик открывается просто. Делаем вьюху:
create or replace view t_test (pref, numb, r_num)
as
select
pref,
numb,
rownum from
transinvcust
а потом выборку из нее
select * from t_test
where r_num <20 and r_num>10
Все работает, все счастливы, никаких тормозов, лишних выборок и проч... итд, итп... ;)