Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос на выборку данных / 25 сообщений из 30, страница 1 из 2
13.12.2005, 13:00
    #33432785
tomasso
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
Добрый день!
У меня такой вопрос:
есть таблица с полями
id_name name
-------- -------
1 Вася
2 Лена
6 Костя
8 Василиса
9 Володя
10 Света
12 Денис
13 Тоня
14 Костя
всего 9 записей
Как в DB2 составить запрос на выборку, например, с 3-ей по 7-ую записи?
В mysql аналог limit
...
Рейтинг: 0 / 0
13.12.2005, 13:06
    #33432808
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
Если говорить о том, что с третьей - то, такое не предусмотрено.
А ограничить выборку N записей:
Код: plaintext
1.
select * from TBL fetch first  10  rows only
Если хочешь считывать строки страницами (по 10 штук), то сохраняй id последней записи и делай так:
Код: plaintext
1.
select * from TBL where ID> id_save fetch first  10  rows only
...
Рейтинг: 0 / 0
13.12.2005, 13:09
    #33432816
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
tomassoДобрый день!
У меня такой вопрос:
есть таблица с полями
id_name name
-------- -------
1 Вася
2 Лена
6 Костя
8 Василиса
9 Володя
10 Света
12 Денис
13 Тоня
14 Костя
всего 9 записей
Как в DB2 составить запрос на выборку, например, с 3-ей по 7-ую записи?
В mysql аналог limit
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select * 
  from (
          select id_name,
                 name,
                 row_number() over(order by id_name) as rn
            from ТАБЛИЦА_С_ИМЕНАМИ
       )
 where rn between  3  and  7 
...
Рейтинг: 0 / 0
13.12.2005, 13:18
    #33432867
tomasso
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
Огромное спасибо!!!
Выручили!
...
Рейтинг: 0 / 0
13.12.2005, 15:20
    #33433419
Herr Developer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
gardenmanЕсли говорить о том, что с третьей - то, такое не предусмотрено.

Предусмотрено, еще как предусмотренно...
...
Рейтинг: 0 / 0
13.12.2005, 15:40
    #33433496
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
Herr Developer gardenmanЕсли говорить о том, что с третьей - то, такое не предусмотрено.

Предусмотрено, еще как предусмотренно...
Нука-нука... )) Покажи...))
...
Рейтинг: 0 / 0
13.12.2005, 16:05
    #33433567
Herr Developer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
gardenman Herr Developer gardenmanЕсли говорить о том, что с третьей - то, такое не предусмотрено.

Предусмотрено, еще как предусмотренно...
Нука-нука... )) Покажи...))

Код: plaintext
1.
...row_number() over(order by id_name) as rn...
Чем нерешения?! ))
...
Рейтинг: 0 / 0
13.12.2005, 16:33
    #33433675
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
А тем, что сначала полною выборку построит, потом- пронумерует, профильтрует и тока тотом ответ даст. Во как!... Решение, но не производительное. Фигня короче.
...
Рейтинг: 0 / 0
13.12.2005, 17:00
    #33433764
Herr Developer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
gardenmanА тем, что сначала полною выборку построит, потом- пронумерует, профильтрует и тока тотом ответ даст. Во как!... Решение, но не производительное. Фигня короче.
Так работает же "фигня такая" Тем более "тут" мигрируют с MySQL
Самой простой способ сделать ограниченный и кустамизированный по сорту листинг!
И уж на много "дешевле", чем вытаскавать все на клиента и там "колбасить"
...
Рейтинг: 0 / 0
13.12.2005, 18:07
    #33434038
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
Ну, если уж на то пошло, то есть замечательная функция keep, которая позволяет пронумеровать записи без привлечения аналитических функций:

дивися:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
connect to test@

with 
	tmp (i,n,x,dt,tm,ts) as (
		values (
			 1 ,
			int(rand()* 1000 ),
			round(rand()* 1000 , 2 ),
			current date - int( 365 *rand()) days,
			current time - int(rand()* 10000 ) seconds,
			current timestamp - int(rand()* 10000 ) seconds
		)
	union all
		select 
			i+ 1 ,
			int(rand()* 1000 ),
			round(rand()* 1000 , 2 ),
			current date - int( 365 *rand()) days,
			current time - int(rand()* 10000 ) seconds,
			current timestamp - int(rand()* 10000 ) seconds
		from
			tmp
		where
			i< 10 
	)
select 
	i,
	keep(n) 	previous, 
	n 			current,
	n-keep(n) 	difference,
	decimal(keep(x), 17 , 2 ) keep_x,
	decimal(x-keep(x), 17 , 2 ) x_keep_x,
	decimal(x, 17 , 2 ) x,
	dt,
	keep(dt),
	tm,
	keep(tm),
	ts,
	keep(ts)
from 
	tmp@


I           PREVIOUS    CURRENT     DIFFERENCE  KEEP_X              X_KEEP_X            X                   DT          9           TM        11        TS                          13                         
----------- ----------- ----------- ----------- ------------------- ------------------- ------------------- ---------- ---------- -------- -------- -------------------------- --------------------------
           1             0           468           468                  0 , 00                743 , 74                743 , 74   08 . 05 . 2005  -           23 : 23 : 56  -         2005 - 07 - 20 - 22 . 43 . 41 . 328000  -                         
           2           468           599           131                743 , 74              - 635 , 46                108 , 28   23 . 10 . 2004   08 . 05 . 2005   22 : 06 : 34   23 : 23 : 56   2005 - 07 - 20 - 23 . 28 . 26 . 328000   2005 - 07 - 20 - 22 . 43 . 41 . 328000 
           3           599           361         - 238                108 , 28                464 , 13                572 , 41   11 . 12 . 2004   23 . 10 . 2004   22 : 42 : 15   22 : 06 : 34   2005 - 07 - 20 - 23 . 40 . 33 . 328000   2005 - 07 - 20 - 23 . 28 . 26 . 328000 
           4           361           517           156                572 , 41                230 , 47                802 , 88   16 . 02 . 2005   11 . 12 . 2004   00 : 07 : 14   22 : 42 : 15   2005 - 07 - 21 - 00 . 19 . 30 . 328000   2005 - 07 - 20 - 23 . 40 . 33 . 328000 
           5           517           657           140                802 , 88              - 633 , 90                168 , 98   17 . 03 . 2005   16 . 02 . 2005   22 : 39 : 30   00 : 07 : 14   2005 - 07 - 20 - 21 . 59 . 46 . 328000   2005 - 07 - 21 - 00 . 19 . 30 . 328000 
           6           657           147         - 510                168 , 98                335 , 83                504 , 81   08 . 11 . 2004   17 . 03 . 2005   00 : 34 : 10   22 : 39 : 30   2005 - 07 - 20 - 23 . 22 . 47 . 328000   2005 - 07 - 20 - 21 . 59 . 46 . 328000 
           7           147           303           156                504 , 81                188 , 08                692 , 89   25 . 08 . 2004   08 . 11 . 2004   00 : 21 : 10   00 : 34 : 10   2005 - 07 - 20 - 22 . 06 . 30 . 328000   2005 - 07 - 20 - 23 . 22 . 47 . 328000 
           8           303           153         - 150                692 , 89                - 9 , 69                683 , 19   03 . 08 . 2004   25 . 08 . 2004   00 : 33 : 02   00 : 21 : 10   2005 - 07 - 20 - 23 . 33 . 40 . 328000   2005 - 07 - 20 - 22 . 06 . 30 . 328000 
           9           153           177            24                683 , 19              - 491 , 84                191 , 35   21 . 12 . 2004   03 . 08 . 2004   22 : 27 : 49   00 : 33 : 02   2005 - 07 - 20 - 22 . 18 . 33 . 328000   2005 - 07 - 20 - 23 . 33 . 40 . 328000 
          10           177           732           555                191 , 35                312 , 57                503 , 92   26 . 05 . 2005   21 . 12 . 2004   23 : 25 : 33   22 : 27 : 49   2005 - 07 - 20 - 22 . 28 . 34 . 328000   2005 - 07 - 20 - 22 . 18 . 33 . 328000 

   10  record(s) selected.


...
Рейтинг: 0 / 0
13.12.2005, 18:33
    #33434104
Herr Developer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
gardenmanНу, если уж на то пошло, то есть замечательная функция keep, которая позволяет пронумеровать записи без привлечения аналитических функций:

А где эта замечательная функция KEEP есть то?
...
Рейтинг: 0 / 0
14.12.2005, 05:22
    #33434577
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
gardenmanА тем, что сначала полною выборку построит, потом- пронумерует, профильтрует и тока тотом ответ даст. Во как!... Решение, но не производительное. Фигня короче.Хех, а как ты хотел, однако???
Вот предположим, есть у тебя выборка. Пусть в ней будет 1000000 строк. Пусть ты хочешь показать строки с 999990 по 1000000 (это очень стандартная ситуация, к примеру, постраничный просморт данных на веб-сайте). Тут ты хоть матушку-репку пой, но тебе-таки придется выдернуть все 1000000 записей, чтобы добраться до 10 последних.
Как вариант, можно скомбинировать fetch first N rows only с аналитической функцией. Кроме того, если сортировка не нужна, то можно аналитическую функцию указать без кляузы ORDER BY (то есть написать row_number() over() ). Всё это позволит немного улучшить картину, но только в тех случаях, когда мы будем выбирать небольшое число строк от начала результирующего датасета.
...
Рейтинг: 0 / 0
14.12.2005, 05:39
    #33434583
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
2Владимир Конев
...row_number() over(order by id_name)
Наличие индекса по id_name тоже
...
Рейтинг: 0 / 0
14.12.2005, 08:33
    #33434697
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
golsa2Владимир Конев
...row_number() over(order by id_name)
Наличие индекса по id_name тожеЕсли честно, то я не понял, что ты ЭТИМ хотел сказать...
...
Рейтинг: 0 / 0
14.12.2005, 11:08
    #33435056
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
Herr Developer gardenmanНу, если уж на то пошло, то есть замечательная функция keep, которая позволяет пронумеровать записи без привлечения аналитических функций:

А где эта замечательная функция KEEP есть то?

Эта волшебная функция есть у меня
Позволяет сохранить значение поля для выражений в следующей строке.
Т.е. позволяет очень очень быстро выполнять некоторые аналитические функции без всяких сортировок (типа расчета остатков нарастающим итогом)
Особенно если идет по индексу - вообще веселуха.

Я б даже для IBM сделал suggestion чтоб они эту фичу в стандартную возможность DB2 записали.
кстати на эту идею меня TORT натолкнул еще год назад.

Может исходники выложить? Они ооочень короткие и оооочень простые. Хочешь?

автор
Хех, а как ты хотел, однако???


Однако не надо мне объяснять прописные истины. Я лишь хочу подчеркнуть тот факт, что все в итоге зависит от проектирования. И такие запросы как - дать 10 записей из выборки начиная с 100-й - яркий пример как впустую транжирить ресурсы сервера. Я в своей базе никогда не допущу подобного.

В противовес - дать 10 записей начиная со значения ключа - совсем другое дело. Тут накладные расходы сервера - минимальны.
...
Рейтинг: 0 / 0
14.12.2005, 11:20
    #33435091
Alexey Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
Как вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WITH Q1(ID_NAME, ROW_NUM) AS
(SELECT MIN(G.ID_NAME),  1 
FROM TABLE1 G
UNION ALL
SELECT G.ID_NAME, Q1.ROW_NUM +  1 
FROM TABLE1 G, Q1
WHERE Q1.ROW_NUM <  3 
  AND G.ID_NAME = (SELECT MIN(T1.ID_NAME) FROM TABLE1 T1 WHERE T1.ID_NAME > Q1.ID_NAME)),

Q2(START_ID) AS
(SELECT MAX(Q1.ID_NAME)
FROM Q1)

SELECT G.ID_NAME, G.NAME
FROM TABLE1 G
WHERE G.ID_NAME >= (SELECT Q2.START_ID FROM Q2)
FETCH FIRST  7  ROWS ONLY
...
Рейтинг: 0 / 0
14.12.2005, 11:37
    #33435157
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
2 Alexey Popov
Прикольно. )) Сначала прошагать нужное количество записей, а потом выбрать столько сколько нужно. Только >3 надо параметризовать. А так действительно - все верно. Вариант почти рабочий. Но опять же - накладных расходов много будет если "пропустить записей нужно будет много.

Дело в том, что запрос Q1 пойдет по индексу - это еще не факт.
Так что нужно подправить.
...
Рейтинг: 0 / 0
14.12.2005, 12:07
    #33435258
Alexey Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
2 gardenman
Понимаю, что будет фетч всех записей от первой до стартовой (третьей) ради её нахождения. И будет странно, если не по индексу.
Отличие от варианта с ROW_NUMBER в том, что предикаты по ключевому полю должны сработать быстрее. IMHO.

Если это простой листинг данных порциями, то разумнее запоминать последний ID_NAME с последуйщим запросом новой порции данных. Как в твоём первом ответе.
Но в вопросе это не видно (мне).
...
Рейтинг: 0 / 0
14.12.2005, 12:48
    #33435383
Herr Developer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
gardenman
Я б даже для IBM сделал suggestion чтоб они эту фичу в стандартную возможность DB2 записали.
кстати на эту идею меня TORT натолкнул еще год назад.

Начнеться public beta Viper'a тогда надо делать suggestion IBMу

gardenman
Может исходники выложить? Они ооочень короткие и оооочень простые. Хочешь?

Сейчас думаю, где бы это могло пригодиться...
Во, например, можно легко график баланса сделать, как денюжки клиентов притикали/отнекали во времени

Выкладывай сюда!
Или лучше сделать ветку типа "KEEP - bla-bla-bla function"
Чтоб, если что, народ мог свои wishes писать и благодарности
...
Рейтинг: 0 / 0
14.12.2005, 12:53
    #33435400
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
Ок!)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
08.10.2008, 19:17
    #35584125
olegrolik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
Вот задался вопросом - надо сделать пэйджинг таблицы.
Всё бы хорошо, да id не инкрементируется, т.е. не 1,2,3... 99,100, а рандомные. Записей много - миллион, т.е. считывать весь миллион записей и выдавать, скажем, 100, пользователю - не рационально. Как здесь быть?
...
Рейтинг: 0 / 0
09.10.2008, 10:03
    #35584762
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
olegrolikВот задался вопросом - надо сделать пэйджинг таблицы.
Всё бы хорошо, да id не инкрементируется, т.е. не 1,2,3... 99,100, а рандомные. Записей много - миллион, т.е. считывать весь миллион записей и выдавать, скажем, 100, пользователю - не рационально. Как здесь быть?Как часто записи в таблице удаляются или вставляются?
...
Рейтинг: 0 / 0
09.10.2008, 11:17
    #35584989
olegrolik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
Mark Barinstein, спасибо за ответ. Нашёл вариант вот такой:
SELECT * FROM (
SELECT id, name,
rownumber() OVER
()
AS ROW_NEXT
FROM hockey
)
as product_temp WHERE
ROW_NEXT BETWEEN 0 and 100

У меня будет веб-приложение (страничка-jsp) а там легко сохранять 0 и 100, потом изменять эти значения на 101 и 200, и так далее...
Хотелось бы услышать ваш вариант.
Записи будут добавляться постоянно. Это тестовое приложение для изменения записей в таблице, но возможно практическое применение.
...
Рейтинг: 0 / 0
09.10.2008, 13:39
    #35585522
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
olegrolikMark Barinstein, спасибо за ответ. Нашёл вариант вот такой:
SELECT * FROM (
SELECT id, name, rownumber() OVER() AS ROW_NEXT
FROM hockey
) as product_temp
WHERE ROW_NEXT BETWEEN 0 and 100

У меня будет веб-приложение (страничка-jsp) а там легко сохранять 0 и 100, потом изменять эти значения на 101 и 200, и так далее...
Хотелось бы услышать ваш вариант.
Записи будут добавляться постоянно. Это тестовое приложение для изменения записей в таблице, но возможно практическое применение.На миллионе записей у вас будет очень плохая производительность.
Если вам действительно нужно пейджить такое огромное кол-во записей, то здесь я вижу 2 варианта:
1. Держать отдельную таблицу, в которой при каждой вставке/удалении надо будет перенумеровывать строки без пропусков
2. Открывать scrollable курсор и фетчить записи по абсолютному/относительному смещению по нужному кол-ву записей

1-й не подхоит из-за частых изменений
2-й может не подойти, если вы не сможете сохранять для пользователя его ResultSet между вызовами
...
Рейтинг: 0 / 0
11.10.2008, 15:16
    #35589468
olegrolik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку данных
1. Держать отдельную таблицу, в которой при каждой вставке/удалении надо будет перенумеровывать строки без пропусков
2. Открывать scrollable курсор и фетчить записи по абсолютному/относительному смещению по нужному кол-ву записей

1-й не подхоит из-за частых изменений
2-й может не подойти, если вы не сможете сохранять для пользователя его ResultSet между вызовами

1. Не пойму для чего нужна отдельная таблица? Можно немного поподробнее?
2. Я в программировании БД не силён, думаю надо почитать литературу.

А всё же если просто делать пэйджинг без редактирования записей (для начала так - просмотр данных и всё), мой вариант годится?
Т.е. на форме будет две кнопки - предыдущие 100 записей , следующие 100 записей . И при нажатии на каждую кнопку, будет вызываться select (см. выше какой) и данные будут отображаться на jsp-страничке.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос на выборку данных / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]