Sql 如何生成两级循环
如果我有两个变量 A=2 B=3 我想生成这样的结果Sql 如何生成两级循环,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,如果我有两个变量 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 我尝试谷歌,可以达到这个查询1级 declare @start int = 1 declare @end int = 3 ;with numcte AS
A | B | Text
1 | 1 | Text1
1 | 2 | Text2
1 | 3 | Text3
2 | 1 | Text4
2 | 2 | Text5
2 | 3 | Text6
我尝试谷歌,可以达到这个查询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
如何实现两级循环?使用数字表,通过搜索可以使用许多示例。产生一个非常简单的例子的一种方法是:
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
;
努力解决这个问题——它可能看起来令人望而生畏。开始从集合的角度思考 一个相当简单的方法是:
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;
是一个DBFIDLE。对“文本”部分使用交叉连接和行号。尽管递归CTE并不是生成数字的最有效方法。