Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить таблицу 
:(
    Опции темы
uranpro
Дата 2.2.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



добрый день, есть простая задача, получить таблицу такого вида
1
2
2
3
3
3
4
4
4
4
... до 500
зачем я не знаю, попросили.
делаю так
Код

    declare @t table (Idx int);
    declare @i int;
    declare @j int;
    
    set @i=1;

    while @i<501 begin
        
        set @j = @i;
        
        while @j>0 begin
            insert into @t values(@i);
            set @j = @j - 1;
            end
        
        set @i = @i + 1;
        
        end
    
    select * from @t;

работает не очень быстро, как можно оптимизировать запрос ?


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Deniz
Дата 2.2.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 1
Всего: 44



А вот так:
Код

  declare @t table (Id int);
  declare @i int;
  set @i=1;
  while @i<501 begin
    insert into @t values(@i);
    set @i = @i + 1;
  end
  select t1.id
    from @t t1
    join @t t2 on (t1.id >= t2.id)


Это сообщение отредактировал(а) Deniz - 2.2.2010, 12:33


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Zloxa
Дата 2.2.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(uranpro @  2.2.2010,  11:48 Найти цитируемый пост)
зачем я не знаю, 

очень зря, возможно это упражнение на рекурсивные запросы.

К сожалению sql2005 у мну не установлен потому для PG:
Код

tst_db=# with recursive t(idx,cntr)
tst_db-#   as (select 1,1
tst_db(#       union all select case when cntr < idx then idx else idx+1 end
tst_db(#                        ,case when cntr < idx then cntr +1 else 1 end
tst_db(#                 from t
tst_db(#                 where idx <6 and cntr <6-1)
tst_db-# select idx from t ;
 idx
-----
   1
   2
   2
   3
   3
   3
   4
   4
   4
   4
   5
   5
   5
   5
   5
(15 rows)



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
uranpro
Дата 2.2.2010, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



=) так чуть быстрее, спасибо)

Добавлено через 10 минут и 48 секунд
Zloxa, нет, не упражнение =)
Тот, кто попросил(чье имя мы не произносим =) ), сообщил, что это нужно для связи с его таблами.
есть таблица
Код

table t1 (info nvarchar(80), Qty int)

он хочет сделать так
Код

select * from t1 inner join
(query) t2 on t1.qty = t2.idx

т.е. чтобы строка печаталась Qty раз =)

Добавлено через 12 минут и 8 секунд
и еще, он делает отчет в CrystalReports 8.5, а там запросы писать нельзя =(


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Zloxa
Дата 2.2.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(uranpro @  2.2.2010,  12:33 Найти цитируемый пост)
там запросы писать нельзя

тафталогия какаято

MS SQL Какой версии?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
uranpro
Дата 2.2.2010, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Zloxa, в самом кристале 8.5, через ODBC. функция AddCommand появилась, по его утверждению, с 10 версии.


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Zloxa
Дата 2.2.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(uranpro @  2.2.2010,  12:33 Найти цитируемый пост)
т.е. чтобы строка печаталась Qty раз =)

Код

tst_db=# with recursive
tst_db-#   srctbl as (select 3 qty , 'any' str
tst_db(#             union all select 2,'many'
tst_db(#             union all select 1,'money'
tst_db(#             union all select 4,'more'
tst_db(#             )
tst_db-#  ,t(qty,str,idx)
tst_db-#   as (select qty,str,1 from srctbl
tst_db(#       union all select qty,str,idx+1 from t where idx < qty )
tst_db-# select * from t
tst_db-# order by 1;
 qty |  str  | idx
-----+-------+-----
   1 | money |   1
   2 | many  |   2
   2 | many  |   1
   3 | any   |   1
   3 | any   |   2
   3 | any   |   3
   4 | more  |   2
   4 | more  |   4
   4 | more  |   3
   4 | more  |   1
(10 rows)

здесь srctbl  - иммитация исходной таблицы.
Пример опять таки выполнялся на постгри, но на MS SQL 2005 и выше, вроде должен работать так же.
Цитата(uranpro @  2.2.2010,  13:02 Найти цитируемый пост)
 в самом кристале 8.5

Есть понимание между версией отчетника и версией СУБД?

Цитата(uranpro @  2.2.2010,  13:02 Найти цитируемый пост)
ункция AddCommand появилась, по его утверждению, с 10 версии. 

 smile  ЩИТО ЭТО?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
uranpro
Дата 2.2.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Цитата(Zloxa @  2.2.2010,  13:11 Найти цитируемый пост)
Есть понимание между версией отчетника и версией СУБД?

нет
Цитата(Zloxa @  2.2.2010,  13:11 Найти цитируемый пост)
smile  ЩИТО ЭТО? 

функция в CrystalReports))
Код

with recursive

нет в mssql =(


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Zloxa
Дата 2.2.2010, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(uranpro @  2.2.2010,  13:23 Найти цитируемый пост)
нет в mssql =( 

Есть(пыщ,пыщ), но начиная с версии 2005 именно потому уже третий пост к ряду спрашиваю версию MS SQL.
слово recursive - убрать

в принципе я все сказал.

Это сообщение отредактировал(а) Zloxa - 2.2.2010, 13:34


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Deniz
Дата 2.2.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 1
Всего: 44



Цитата(uranpro @  2.2.2010,  14:33 Найти цитируемый пост)
т.е. чтобы строка печаталась Qty раз =)
это немного расходится с первоначальной постановкой задачи.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Zloxa
Дата 2.2.2010, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(Zloxa @  2.2.2010,  13:32 Найти цитируемый пост)
я все сказал.

не, таки еще не все.
Классический вариант, без всяких рекусрий, для qty< 1024
здесь srctbl  - иммитация исходной таблицы.

Код

 select srctbl.*
 from
 (select 3 qty , 'any' str
 union all select 2,'many'
 union all select 1,'money'
 union all select 4,'more'
 ) srctbl
 ,(select 0 x union all select 1 union all select 2 union all select 3) s0
 ,(select 0 x union all select 1 union all select 2 union all select 3) s1
 ,(select 0 x union all select 1 union all select 2 union all select 3) s2
 ,(select 0 x union all select 1 union all select 2 union all select 3) s3
 ,(select 0 x union all select 1 union all select 2 union all select 3) s4
 where qty > s0.x+s1.x*4+s2.x*4*4+s3.x*4*4*4+s4.x*4*4*4*4
 order by 1;
 qty |  str
-----+-------
   1 | money
   2 | many
   2 | many
   3 | any
   3 | any
   3 | any
   4 | more
   4 | more
   4 | more
   4 | more
(10 rows)


Это сообщение отредактировал(а) Zloxa - 2.2.2010, 14:07


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.2540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.