Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как сделать select "с.. по" / 22 сообщений из 22, страница 1 из 1
16.01.2009, 09:00
    #35760576
nurdus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
Доброе день.
Суть вопроса такая запрос возвращает, например 23 строк:
1 строка
2 строка
3 строка
...
23 строка

Как составить запрос таким образом, чтобы в зависимости от входящего параметра А (принимающий значения 1,2,3... и т.д.),
если А=1, то возвращал с 1 строки по 5 строку
если А=2, то возвращал с 6 строки по 10 строку
если А=3, то возвращал с 11 строки по 15 строку
...
если А=5, то возвращал с 20 строки по 23 строку
ну и т.д.

Большое всем спасибо.
...
Рейтинг: 0 / 0
16.01.2009, 09:57
    #35760685
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
в кащее нельзя выбрать строки с такой-то по такую-то, можно лишь ограничить количество в выборке
select top 20 * from Table
...
Рейтинг: 0 / 0
16.01.2009, 10:24
    #35760756
nurdus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
Спасиб. Жаль конеШно...
А нет какой нить функции, типа счетчика строк...?!
...
Рейтинг: 0 / 0
16.01.2009, 10:27
    #35760769
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
Интересно... А прокатит ли такой вариант?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Select
   *
From
   (select top  20 
      * 
   from
      Table
   ) as a
Where
   (A= 1  AND a.ID between  1  AND  5 )
   OR
   (A= 2  AND a.ID between  6  AND  10 )
...
   OR
   (A= 5  AND a.ID between  20  AND  23 )
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
16.01.2009, 10:28
    #35760771
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
Поправка... Т.е. без

Код: plaintext
 top  20 
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
16.01.2009, 11:39
    #35761040
scaro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
такой вариант с запросом отчасти прокатывает, только в a.ID between 6 AND 10 (и в других) - нельзя завязываться на ID - не факт что по порядку они идут, вернее какието записи могут быть удалены

к тому же еще одна проблема, не известно число таких ограничений
(A=1 AND a.ID between 1 AND 5)
OR
(A=2 AND a.ID between 6 AND 10)

их может быть 5 а может быть 10 или еще больше
...
Рейтинг: 0 / 0
16.01.2009, 12:55
    #35761266
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
Попробуйте %Library.ScrollableResultSet. Обеспечивает произвольный доступ к любой порции результата запроса. Но, ИМХО, это имеет смысл лишь когда обращений к результатам одного и того же запроса достаточно много, иначе неизбежные накладные расходы по копированию ResultSet'а в глобал могут оказаться неоправданными.
В противном случае для вычисления граничных условий запроса более эффективно воспользоваться прямым доступом к глобалу с данными таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 set id=""
 set nr1= 5 *(A- 1 )- 1 , nr2= 5 *A
 for nr= 1 : 1 :nr1,nr1+ 1 : 1 :nr2 {
   set id = $Order(^User.TableD(id))
   goto:id="" EndOfGlobal
   set:nr=nr1 id1=id
 }
 set id2=id

// далее select * from Table where id between id1 and id2

...
EndOfGlobal // обработка ошибочных значений A
SQL- запрос, полагаю, оформите сами :)
...
Рейтинг: 0 / 0
16.01.2009, 14:08
    #35761452
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
scaroнельзя завязываться на ID - не факт что по порядку они идут, вернее какието записи могут быть удалены
Это "ID" результата селекта... А не самой таблицы Table... Там ничего не удаляли. Другое дело что само название свойства у "итоговой" таблицы не такое...
scaroк тому же еще одна проблема, не известно число таких ограничений
...
их может быть 5 а может быть 10 или еще больше
В примере автора все точно описано. В других случаях можно использовать формули и пр. элементы языка...


Т.е. в моем случае это всего лиш предположение...
...
Рейтинг: 0 / 0
16.01.2009, 14:31
    #35761531
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
krvsa
Это "ID" результата селекта....А не самой таблицы Table...
в том запросе это именно ID строк в таблице и соответственно удаляя из середины данные, и выборка будет неправильная
...
Рейтинг: 0 / 0
16.01.2009, 14:34
    #35761543
scaro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
Странно а у меня запрос выдает разное количество записей в зависимости от A если = 1 то 2 записи, а если A = 2 то 1 запись, а даже совсем не по 5 записей
...
Рейтинг: 0 / 0
16.01.2009, 15:08
    #35761656
scaro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
По поводу класса %Library.ScrollableResultSet, у него тут есть свойство CurrRow

/// Number of current row in the temp table, you can set this property to
/// move to a new location and also use this to check the current position.
Property CurrRow As %Integer;

Правильно я понял? что можно задать начальную позицию и от нее Next()'ом пять шагов сделать по результату запроса?
...
Рейтинг: 0 / 0
16.01.2009, 15:13
    #35761669
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
ну в описании к свойству так и написано
...
Рейтинг: 0 / 0
16.01.2009, 15:36
    #35761739
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
krvsaЭто "ID" результата селекта....А не самой таблицы Table...Впервые слышу, что ID - это номер записи в РезалтСете. С т.з. SQL, это все-таки имя поля таблицы. Кстати, похоже, %Library.ScrollableResultSet - единственный гарантированный способ получить мгновенный снимок в Cache, который не будет меняться в течение обработки запроса. Или я ошибаюсь?
...
Рейтинг: 0 / 0
16.01.2009, 15:45
    #35761771
scaro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
в общем %Library.ScrollableResultSet должна подойти, проверил задал начальный CurrRow, и от него прошел Next()'ом 5 строк, сработало
...
Рейтинг: 0 / 0
16.01.2009, 16:05
    #35761835
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
DAiMor , я ID специально написал в кавычках (если че)... Кто знает! Может есть какое-то свойство у результирующей таблицы которое сможет роканать за это самое ID...
Вот про что и пытаюсь объяснить...
...
Рейтинг: 0 / 0
16.01.2009, 16:09
    #35761851
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
scaroСтранно а у меня запрос выдает разное количество записей в зависимости от A если = 1 то 2 записи, а если A = 2 то 1 запись, а даже совсем не по 5 записей
Потому как см. объяснения DAiMor и Alexey Maslov ... Я же быквы I и D (незнаю как еще объяснить) взял чисто условно... В надежде что сотрудники ИС вдруг скажут:
- Да! Конечно! Есть такое свойство у резаулта. Тока оно пишется %rezID

(Это опять же просто предположение)
...
Рейтинг: 0 / 0
16.01.2009, 16:38
    #35761924
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
Krvsa, не сбивайте с толку ньюбов, им и так нелегко...
Допустим, свойство есть. Вот, например, у %Library.ScrollableResultSet, как тут уже писали,
оно и вправду есть (Property CurrRow). Каким образом Вы сумели бы употребить св-во этого объекта (унаследованного от %RegisteredObject) в SQL-запросе?
Или Вы хотите сказать, что по отношению к выборке ResultSet можно использовать SELECT (т.е. она является чем-то вроде временной таблицы)? Но ведь и это не так...
...
Рейтинг: 0 / 0
16.01.2009, 16:51
    #35761965
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
Alexey MaslovИли Вы хотите сказать, что по отношению к выборке ResultSet можно использовать SELECT (т.е. она является чем-то вроде временной таблицы)?
Да. У меня была надежда на это...
Alexey MaslovНо ведь и это не так...
Надежда умерла...
...
Рейтинг: 0 / 0
16.01.2009, 17:39
    #35762098
scaro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
не в запросе ограничивать, а потом в резалтсете уже нужные взять
set rs = ##class(%ScrollableResultSet).%New()
set rs.ClassName = "класс"
set rs.QueryName = "запрос"
do rs.Execute()
if rs.Count() >=5 set rs.CurrRow = 5
set i = 0
While (i<5) && (rs.Next())
{ вынимае все что нужно из запроса
set i = i +1 }
в этом примере я получаю из результата запроса записи с 6ой по 10ую
...
Рейтинг: 0 / 0
16.01.2009, 18:02
    #35762152
nurdus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
СПАСИБО всем большое... :)
...
Рейтинг: 0 / 0
20.01.2009, 03:36
    #35766116
=Dimon=
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
nurdus,
Можно еще вот так:
select count (test_2.id) as rank, test_1.id, test_1.name
from refitem_city.data as test_1 inner join refitem_city.data as test_2 on
test_1.id >= test_2.id
group by test_1.id, test_1.name
having count(test_2.id) between 2 and 4 //выбрать строки со 2 по 4
order by rank
...
Рейтинг: 0 / 0
20.01.2009, 04:16
    #35766125
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать select "с.. по"
Вот тут еще был пример как сделать что-то подобное...
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как сделать select "с.. по" / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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