Как бы его поизящнее "размножить" записи?

Hibernate
Дата: 08.10.2003 18:43:16
Есть таблица вида: I_D, Quantity

Надо получить таблицу,в которой каждому I_D соответствовало Quantity записей.
Пока в голову приходит только тупой двойной цикл - по I_D и по Quantity, внутри которого идет Insert I_D.
Может кто предложит что лучшее?
злой шаман
Дата: 08.10.2003 19:01:54
Можно сложить числа от 1 до максимального Quantity во временную табличку, которую потом заджойнить к основной по условию num<=Quantity.
mcdba
Дата: 08.10.2003 19:43:42
/* пример (немножко не изящно, "в лоб") */

create table idq (I_D int, Quantity int, somefield varchar(100),
CONSTRAINT ID_PK PRIMARY KEY (I_D, Quantity))

insert idq values (1, 12, '') /* insert test data */
insert idq values (5, 24, '')
insert idq values (9, 31, '')
insert idq values (3, 18, '')

create table #qty (fld1 int)

declare @maxqty as int
select @maxqty = max(Quantity) from idq

while @maxqty > 0
begin
insert into #qty values(@maxqty)
SET @maxqty = @maxqty - 1
end

declare @id int
declare @qt int

DECLARE t_cursor CURSOR FAST_FORWARD FOR
select I_D, Quantity from idq order by Quantity desc

OPEN t_cursor

FETCH NEXT FROM t_cursor
INTO @id, @qt

SET NOCOUNT ON
SET QUOTED_IDENTIFIER OFF

WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO idq
SELECT I_D, fld1 as Quantity, '' as somefield
FROM (SELECT @id AS I_D) a
cross join (SELECT fld1 from #qty WHERE fld1 < @qt) b

FETCH NEXT FROM t_cursor
INTO @id, @qt
END

SET NOCOUNT OFF
SET QUOTED_IDENTIFIER ON

drop table #qty

SELECT * FROM idq order by I_D, Quantity -- check results


CLOSE t_cursor
DEALLOCATE t_cursor

drop table idq
GO
злой шаман
Дата: 08.10.2003 20:47:56
Ну зачем же так сразу курсорами? Можно заменить в этом скрипте все, что после declare @id int на элегантный селект

SELECT idq.*

FROM idq
inner join #qty on #qty.fld1<=idq.Quantity
mcdba
Дата: 09.10.2003 10:28:45
Да, согласен, меняем так.

/* изящно, не "в лоб" */

INSERT INTO idq
SELECT idq.I_D, #qty.fld1 as Quantity, idq.somefield
FROM idq
inner join #qty on #qty.fld1<idq.Quantity
Hibernate
Дата: 09.10.2003 10:58:55
Красиво.
Спасибо!
mcdba
Дата: 09.10.2003 12:28:01
Вот так это и бывает.
Программист (mcdba) пишет код, составляя его из обрывков мыслей, носящихся в голове. Первый работающий вариант становится бетой. Мимо проходит technology evangelist (знатный архитектор) Malicious Shaman (страшный колдун), смотрит в код: "Не по фене ботаете, товарисч. Rewrite, nah!" В результате появляется release candidate (можно показывать) для заказчика.
snake
Дата: 09.10.2003 12:37:30
mcdba
истину глаголишь, сын божий!
Glory
Дата: 09.10.2003 12:59:43
А потом приходит Glory и это становится RTM
declare @t table(f1 int identity, fake bit)

declare @limit int
set @limit = 10000
while @limit > 0
begin
set rowcount @limit
insert @t(fake)
SELECT 1
FROM sysobjects t1, sysobjects t2
set @limit = @limit - @@rowcount
end
set rowcount 0

select * from @t
snake
Дата: 09.10.2003 13:04:12
Желаю удачи!