Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите написать select!!!!!!!!!!!!11

3.9K
11 июня 2003 года
JavaMan
6 / / 11.06.2003
Помогите написать "хороший" 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.

заранее спасибо
3.8K
11 июня 2003 года
Grey
20 / / 09.06.2003
Цитата:
Originally posted by JavaMan
Помогите написать "хороший" 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

3.8K
11 июня 2003 года
Grey
20 / / 09.06.2003
так будет лучше:

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
3.9K
11 июня 2003 года
JavaMan
6 / / 11.06.2003
Цитата:
Originally posted by Grey
так будет лучше:

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
и как ты их не сортируй диван тут не окажеться,
хотя его дата создания самая свежая

здесь нужно как-то с индексами сделать вот только как?

3.8K
11 июня 2003 года
Grey
20 / / 09.06.2003
индексы на мой взгляд не помогут
а вот модернизировать твой запрос немного можно добавив условие: 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
283
11 июня 2003 года
Alone
910 / / 20.11.2002
хм...
а LIMIT чем не подходит ?
3.9K
11 июня 2003 года
JavaMan
6 / / 11.06.2003
Цитата:
Originally posted by Alone
хм...
а LIMIT чем не подходит ?



а что такое LIMIT ?

283
11 июня 2003 года
Alone
910 / / 20.11.2002
Цитата:
Originally posted by JavaMan


а что такое LIMIT ?


Выражение LIMIT может использоваться для ограничения количества строк, возвращенных командой SELECT. LIMIT принимает один или два числовых аргумента. Эти аргументы должны быть целочисленными константами. Если заданы два аргумента, то первый указывает на начало первой возвращаемой строки, а второй задает максимальное количество возвращаемых строк. При этом смещение начальной строки равно 0 (не 1):
SELECT * FROM table LIMIT 5,10; # возвращает строки 6-15

Если твоя СУБД не поддерживает это... сочуствую :)

3.9K
11 июня 2003 года
JavaMan
6 / / 11.06.2003
я думаю с сортировкой этот LIMIT плохо поладит

в принципе, это задача должна быть решена
с помощью индекса на столбце create_date
БД у меня Oracle
как только это сделать я не знаю X)-
4
11 июня 2003 года
mike
3.7K / / 01.10.2002
Oracle не поддерживает LIMIT, задача решалась в правильном направлении - через rownum
3.9K
12 июня 2003 года
JavaMan
6 / / 11.06.2003
Цитата:
Originally posted by mike
Oracle не поддерживает LIMIT, задача решалась в правильном направлении - через rownum



Если решать задачу без индексов с rownum
в любои случае прийдется сделать
запрос ко всем строкам из таблицы,
потом их отсортировать, а уже дальше
делать выборку,
а это медленно :(

3.8K
16 июня 2003 года
Grey
20 / / 09.06.2003
попробуй создать индекс по полю "create_date" с сортировкой по убыванию, тогда сортировка в запросе может не понадобиться...
4.5K
18 июня 2003 года
BBHL
5 / / 18.06.2003
Цитата:
Originally posted by JavaMan
Помогите написать "хороший" 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)
и все должно работать... Пройдет всего один селект в условии, в отличии от твоих двух вложенных, все отработает быстро и красиво...

4.5K
18 июня 2003 года
BBHL
5 / / 18.06.2003
Цитата:
Originally posted by BBHL


Если не секрет - нафига такие сложности?
Всего навсего надо:
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)
и все должно работать... Пройдет всего один селект в условии, в отличии от твоих двух вложенных, все отработает быстро и красиво...


сорри - посмотрел на всякий случай доку... так не получится... оракел не умеет так, как я написал... т.к. "вперед он смотреть не умеет"

4.5K
18 июня 2003 года
BBHL
5 / / 18.06.2003
Цитата:
Originally posted by JavaMan
Помогите написать "хороший" 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

Все работает, все счастливы, никаких тормозов, лишних выборок и проч... итд, итп... ;)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог