Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
SQL 2005-2008

имеется таблица с неповторяющими элементами и с количеством каждой такой строчки
как сгенерировать (клонировать) такие строки по заданному кол-ву без циклов

Name  Count
AA      3
BB      4

нужно получить
Name  Count
AA      1
AA      1
AA      1
BB      1
BB      1
BB      1
BB      1


Спасибо
11 апр 13, 19:59    [14169401]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
with CTE
as
(
	select 'a' as name, 2 as cnt union all
	select 'b' as name, 3 as cnt union all
	select 'c' as name, 1 as cnt union all
	select 'd' as name, 6 as cnt
)
,
cte2
as (
select	name,cnt from cte
union all
select a.name,a.cnt-1 
from	cte2 a 
where a.cnt > 1
)

select * from cte2
order by 1,2
11 апр 13, 20:24    [14169490]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
при больших количествах выскакивает ошибка

with CTE
as
(
	select 'a' as name, 2000 as cnt union all
	select 'b' as name, 3000 as cnt union all
	select 'c' as name, 1000 as cnt union all
	select 'd' as name, 6000 as cnt
)
,
cte2
as (
select	name,cnt from cte
union all
select a.name,a.cnt-1 
from	cte2 a 
where a.cnt > 1
)

select * from cte2
order by 1,2


Msg 530, Level 16, State 1, Line 1
The statement terminated. The maximum recursion 100 has been exhausted before statement completion.
12 апр 13, 16:56    [14174301]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
nezhadnye_my
Guest
declare @t table(Name varchar(10),  Count int);
insert into @t (Name, Count)
select 'AA', 3 union all
select 'BB', 4

select t.Name
from master..spt_values v
     join @t t on (v.number between 1 and t.Count)
where v.type = 'P'


вместо master..spt_values взять любую другую таблицу с числами
12 апр 13, 17:16    [14174428]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
qwerty112
Guest
michael R

Msg 530, Level 16, State 1, Line 1
The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

OPTION (MAXRECURSION 0)
12 апр 13, 18:13    [14174738]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
tortoise
Member

Откуда: UK
Сообщений: 532
create table #t2 ( name char(2)),c int)
create table #t ( name char(2),c int)

insert into #t
values('AA',3)
,('BB',4)


select COUNT(1) from #t
while @@ROWCOUNT >0
begin
insert into #t2
select #t.name from #t where (select count(1) from #t2 where #t2.name=#t.name)< #t.c
end

select * from #t2 order by 1
12 апр 13, 18:59    [14174878]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
Гость333
Member

Откуда:
Сообщений: 3683
tortoise,

Протестируйте ваш вариант на таких входных данных:
insert into #t 
values('AA',3000)
,('BB',4000)
, и вы будете опечалены быстродействием (у меня на Core i5 выполнялось 40 секунд).
12 апр 13, 19:14    [14174916]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
tortoise
Member

Откуда: UK
Сообщений: 532
Гость333,

39 seconds

В условии задачи стояло не использовать цикл - поздно обратил внимание, так что по любому не годится
12 апр 13, 19:28    [14174951]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8863
declare @t table ([name] varchar(20),
                  [count] int);
insert into @t
values ('AA', 2000), ('BB',2000)

select * from @t


select t.[name], 1 
from @t t
join (select distinct number from master.dbo.spt_values where number > 0) v
on  number <= [count]
13 апр 13, 03:56    [14175875]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8863
В spt_values distinct(number) в диапазоне 1 - 2000 возрастает монотонно с шагом 1.
Где-то обсуждался вопрос надёжности этой таблицы,- но я тут ни чего гарантировано утверждать не могу. Можно воспользоваться поиском по форуму. Если количество дублей зашкаливает за херзнаетсколько, то можно создать свою таблицу... Можно всё завернуть в CTE (рус. - ОТВ; кому как нравится).

И вообще нехер постить сюда учебные задачи ...
13 апр 13, 04:01    [14175876]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
всем спасибо

с СTE похоже самый лучший вариант
доп таблица хорошо, но держать таблицу с дохрена полями как то не очень
системная только до 2000 тысяч


И вообще нехер постить сюда учебные задачи ...

откуда такая увереность в данном заявлении ?
13 апр 13, 13:44    [14176240]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
michael R
держать таблицу с дохрена полями как то не очень
Я у себя держу постоянную таблицу с числами от 0 до миллиона.
Наскоько я знаю, тут так поступают многие.

1 число - 1 строка - 4 байта.
Миллион записей - 4 Мб.
Плюс возможный индекс - ну, 15 Мб.
И это много?!!
13 апр 13, 14:22    [14176307]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
iap
нее
просто задача как можно меньше изменений
для улучшения работы вместо циклов
изменить только запрос достаточно
без доп работы в базе

спасибо
13 апр 13, 15:41    [14176494]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
iap
таки да
с доп таблицей на порядок быстрее
и это заметно на больших количествах
15 апр 13, 12:08    [14180700]     Ответить | Цитировать Сообщить модератору
 Re: Клонировать строчки в таблице по заданному кол-ву без циклов  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8863
michael R
iap
таки да
с доп таблицей на порядок быстрее
и это заметно на больших количествах


Ктобсомневался...
Ещё и ограничения (как на вложенность при рекурсии) нет... Хренлибы иначе сюда такой "архаичный" вариант был запощен
22 апр 13, 01:48    [14210989]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить