Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / получение части результатов запроса / 12 сообщений из 12, страница 1 из 1
13.02.2001, 20:43
    #32002223
Brand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
subj собственно.. вроде если нужно получить первые n строк — проблем нет:
select top n ... а что делать если нужны строки с 20 по 35 например?
select top 20 ... select top 15?
а сразу как-нибудь, да побыстрее
...
Рейтинг: 0 / 0
14.02.2001, 00:11
    #32002225
dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
Варианты:
1) Объявить курсор. С помощью Fetch Absolute Установиться куда нужно и вперед - забрасываешь во вревенную таблицу либо целиком строчки результирующего запрса, либо ключи. А потом соответственно из этой временной таблицы уже брать результат Select-ом.

Встречный вопрос - кто знает как работает внутри этот самый Fetch Absolute? Перебирает строчки вхолостую по одной до тех пор пока не дойде до указанной или как то умеет сразу установится куда нужно?
2) Create #temp (id int identity, ...)
/* Под ... понимается структура рез. запроса*/
Insert into #temp
select ... from ... where .... -это запрос часть которого надо получить
select from #temp where id between 20 and 35
Опять же при желании можно в #temp кидать только ключи.
3) Использовать соотв. методы ADO
4) использовать перебор запроса на клиенте для выделения нужной части запроса. Но это самый плохой вариант, конечно.
...
Рейтинг: 0 / 0
14.02.2001, 13:31
    #32002243
VadimB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
Вариант длля случая, если нужно получить первые n строк,
КОТОРЫЕ ОТСОРТИРОВАННЫ ПО УНИКАЛЬНЫМ КЛЮЧАМ.

declare @StartRecord int
declare @RecordInPage int
declare @MaxKey varchar(255)

-- строки с 200 по 235
set @StartRecord=200
set @RecordInPage=35

set rowcount @StartRecord
select @MaxKey= max(UK) from T order by UK -- нати максимальный уникальный ключ для первых @StartRecord записей
set rowcount 0

set rowcount @RecordInPage
select * from T where UK > @MaxKey order by UK -- выдать @RecordInPage записей, пропустив первые @StartRecord записей
set rowcount 0
...
Рейтинг: 0 / 0
14.02.2001, 19:18
    #32002265
Brand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
declare @var1 int
set @var1 = 10
set rowcount @var1
select ....
почему-то не работает, а..
set rowcount 10
select ....
работает замечательно. в чем может быть дело? :|
...
Рейтинг: 0 / 0
14.02.2001, 19:23
    #32002267
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
Просто в командах SET, устанавливающих параметры, нельзя использовать в качестве значений переменные или выражения - только константы.
...
Рейтинг: 0 / 0
14.02.2001, 19:29
    #32002269
Alexander Rudenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
Странно а у меня комбинация
SET ROWCOUNT @count
Работает нормально, только я @count передаю как параметр процедуры.
может я чего-то не правильно понял?
...
Рейтинг: 0 / 0
14.02.2001, 22:43
    #32002274
Дед Маздай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
Syntax: SET ROWCOUNT { number | @number_var } - так что все должно работать (и работает) нез. от того, п-р это или нет.
Суть на с.д. не в этом, а в том, что set rowcount никак не влияет на план запроса - тот все равно выполняется весь и до конца, а потом уже из него выбирается rowcount записей. Предикат top, напротив, встраивается в план и учит.статистику, поэт.на больших данных он, конечно, лучше. След., пред.пример можно переписать как
declare @StartRecord bigint, @MaxKey int
set @StartRecord = 200
declare @s nvarchar(4000)
set @s = 'select top ' + cast(@StartRecord as varchar(10)) + ' @p = UK from T order by UK'
exec sp_executesql @s, N'@p int out', @MaxKey out
...
...
Рейтинг: 0 / 0
03.09.2001, 07:25
    #32013354
CrazyMike
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
Ребята, запостите, пожалуйста целиком код запроса... Просто я никак не могу себе представить целиком код... А так - может разберусь....
...
Рейтинг: 0 / 0
03.09.2001, 08:40
    #32013358
bitof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
Имеем таблицы:
TBL1 - исходная
TBL2 - вспомогательная

TBL1:
----
fld1
fld2
...
fldn

TBL2
---
rowID int identity
fld1,
fld2,
...
fldn

дальше все просто:

truncate table TBL2
go
insert into TBL2 (fld1, fld2, ..., fldn)
select fld1, fld2, ..., fldn from TBL1
go
delete from TBL2 where rowID<@N_Low or rowID>@N_High
go
select fld1, fld2,..., fldn from TBL2
...
Рейтинг: 0 / 0
03.09.2001, 14:03
    #32013380
CrazyMike
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
Спасибо большое - пойду разбираться...
...
Рейтинг: 0 / 0
03.09.2001, 14:31
    #32013384
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
IMHO предложенный код не вполне оптимален(копировать целиком исходную таблицу, а затем удалять большинство записей?) и корректен (если TBL2 -постоянная таблица, то как все это будет работать в многопользовательской среде, когда несколько пользователей попытаются получать свои данные ?)

Я бы предложил такой вариант в виде процедуры, исходя из

- основная таблица mytable имеет PRIMARY KEY любого типа (я выбрал поле myid, int, IDENTITY для простоты)


CREATE PROCEDURE paging (@lowest_rec int, @highest_rec int) AS

/*создаем временную таблицу, cast пришлось использовать из-за IDENTITY*/
select identity(int, 1,1) as id_tmp, cast(myid as int) as myid into #tmp_paging from mytable where 1=2

/*нумеруем записи из основной таблицу, можно добавить where и order*/
insert into #tmp_paging(myid) select myid from mytable

/*выбираем нужные записи*/
select t.* from #tmp_paging as tmp inner join mytable as t on tmp.id=t.myid
where tmp.id_tmp BETWEEN @lowest_rec AND @highest_rec
...
Рейтинг: 0 / 0
03.09.2001, 14:43
    #32013385
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
получение части результатов запроса
Извиняюсь, ошибочка вышла в последнем запросе

select t.* from #tmp_paging as tmp inner join mytable as t on tmp. myid =t.myid
where tmp.id_tmp BETWEEN @lowest_rec AND @highest_rec
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / получение части результатов запроса / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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