powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос на выборку данных
25 сообщений из 30, страница 1 из 2
запрос на выборку данных
    #33432785
tomasso
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
У меня такой вопрос:
есть таблица с полями
id_name name
-------- -------
1 Вася
2 Лена
6 Костя
8 Василиса
9 Володя
10 Света
12 Денис
13 Тоня
14 Костя
всего 9 записей
Как в DB2 составить запрос на выборку, например, с 3-ей по 7-ую записи?
В mysql аналог limit
...
Рейтинг: 0 / 0
запрос на выборку данных
    #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
запрос на выборку данных
    #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
запрос на выборку данных
    #33432867
tomasso
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо!!!
Выручили!
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33433419
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanЕсли говорить о том, что с третьей - то, такое не предусмотрено.

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

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

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

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

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

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

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

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

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

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


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

В противовес - дать 10 записей начиная со значения ключа - совсем другое дело. Тут накладные расходы сервера - минимальны.
...
Рейтинг: 0 / 0
запрос на выборку данных
    #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
запрос на выборку данных
    #33435157
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexey Popov
Прикольно. )) Сначала прошагать нужное количество записей, а потом выбрать столько сколько нужно. Только >3 надо параметризовать. А так действительно - все верно. Вариант почти рабочий. Но опять же - накладных расходов много будет если "пропустить записей нужно будет много.

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

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

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

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

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

Выкладывай сюда!
Или лучше сделать ветку типа "KEEP - bla-bla-bla function"
Чтоб, если что, народ мог свои wishes писать и благодарности
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33435400
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок!)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
запрос на выборку данных
    #35584125
olegrolik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот задался вопросом - надо сделать пэйджинг таблицы.
Всё бы хорошо, да id не инкрементируется, т.е. не 1,2,3... 99,100, а рандомные. Записей много - миллион, т.е. считывать весь миллион записей и выдавать, скажем, 100, пользователю - не рационально. Как здесь быть?
...
Рейтинг: 0 / 0
запрос на выборку данных
    #35584762
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
olegrolikВот задался вопросом - надо сделать пэйджинг таблицы.
Всё бы хорошо, да id не инкрементируется, т.е. не 1,2,3... 99,100, а рандомные. Записей много - миллион, т.е. считывать весь миллион записей и выдавать, скажем, 100, пользователю - не рационально. Как здесь быть?Как часто записи в таблице удаляются или вставляются?
...
Рейтинг: 0 / 0
запрос на выборку данных
    #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
запрос на выборку данных
    #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
запрос на выборку данных
    #35589468
olegrolik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Держать отдельную таблицу, в которой при каждой вставке/удалении надо будет перенумеровывать строки без пропусков
2. Открывать scrollable курсор и фетчить записи по абсолютному/относительному смещению по нужному кол-ву записей

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

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

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


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