Введите уникальное значение несколько раз в зависимости от столбца переменной - PullRequest
0 голосов
/ 18 марта 2020

В моей таблице есть следующие столбцы:

PromotionID | NumberOfCodes 
1             10
2             5

Мне нужно несколько раз вставить PromotionID в новую таблицу SQL - в зависимости от значения в NumberOfCodes.

Итак, учитывая вышеизложенное, мой набор результатов должен выглядеть так:

PromotionID 
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2

Ответы [ 3 ]

2 голосов
/ 18 марта 2020

Вам нужен рекурсивный cte:

with r_cte as (
     select t.PromotionID, 1 as start, NumberOfCodes 
     from table t
     union all
     select id, start + 1, NumberOfCodes 
     from r_cte 
     where start < NumberOfCodes 
)
insert into table (PromotionID)
  select PromotionID
  from r_cte 
  order by PromotionID;

Уровень рекурсии по умолчанию 100, используйте подсказку запроса option(maxrecursion 0), если у вас есть NumberOfCodes больше.

1 голос
/ 18 марта 2020

Я предпочитаю подсчет за такие вещи. Как только вы начинаете работать с большими наборами строк, производительность rCTe очень быстро падает:

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2) --Up to 100 rows. Add more cross joins to N for more rows
SELECT YT.PromotionID
FROM dbo.YourTable YT
     JOIN Tally T ON YT.NumberOfCodes >= T.I;
0 голосов
/ 18 марта 2020

Одна опция использует рекурсивное общее табличное выражение для генерации строк из исходной таблицы, которые затем можно вставить в целевую таблицу:

with cte as (
    select promotion_id, number_of_codes n from sourcetable 
    union all select promotion_id, n - 1 from mytable where n > 1
)
insert into targettable (promotion_id)
select promotion_id from cte
...