Как создать петлю 2 уровней - PullRequest
1 голос
/ 24 мая 2019

Если у меня 2 переменные

  • A = 2
  • B = 3

Я хочу создать такой результат

A  |  B  |  Text

1  |  1  |  Text1
1  |  2  |  Text2
1  |  3  |  Text3
2  |  1  |  Text4
2  |  2  |  Text5
2  |  3  |  Text6

Я пытаюсь Google и могу достичь 1 уровня с этим запросом

    declare @start int = 1
    declare @end  int = 3

    ;with numcte  
    AS  
    (  
      SELECT @start as [SEQUENCE]
      UNION all  
      SELECT [SEQUENCE] + 1
      FROM numcte WHERE [SEQUENCE] < @end 
    )      
    SELECT  [SEQUENCE], 'text' + CAST([SEQUENCE] as varchar) as [text] FROM numcte

Как мне пройти 2 уровня цикла?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Один довольно простой метод:

select a.a, b.b, concat('text', row_number() over (order by a, b))
from (values (1), (2)) a(a) cross join
     (values (1), (2), (3)) b(b);

Или, если вы действительно хотите объявить переменные:

declare @a int = 2;
declare @b int = 3;
with n as (
      select 1 as n union all
      select n + 1
      from n
      where n < @a or n < @b
    )
select na.n as a, nb.n as b, concat('text', row_number() over (order by na.n, nb.n))
from n na join
     n nb
     on na.n <= @a and nb.n <= @b;

Здесь - это db <> скрипка.

1 голос
/ 24 мая 2019

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

with cte as (
   select 1 as num 
   union all select num + 1 from cte where num < 3 )
select cte.num, cte2.num from cte  
cross join cte as cte2 
where cte.num in (1, 2)
order by cte.num, cte2.num
;

Пройдите через это - это может показаться пугающим. Начните думать с точки зрения наборов! Fiddle

...