如何在while循环中使用UNION ALL

时间:2018-10-19 05:37:08

标签: tsql

我应该如何使用Union All来获取集合中while循环的结果,以便可以将其用于填充组合框中的数据。

这是我尝试将所有内容合并的sql代码

Declare @start int = 1

While(@start <= 24)
Begin 
 (select @start as ColumnA) union All  ----need to fix this line
set @start = @start + 1 
End

预期的输出:

ColumnA
1
2
.
.
.
24(up to 24)

3 个答案:

答案 0 :(得分:1)

使用递归的公用表表达式(cte)产生所需的结果:

with cte (n) as 
(    
    values (1)              -- anchor
    union all 
    select n + 1 from cte   -- recursive
    where n < 24            -- terminate
)
select * from cte;

答案 1 :(得分:0)

SQL Server解决方案可能与此类似。上限为100,但是提高上限并不困难

WITH x AS 
(
  SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)
)
SELECT 1 + ones.n + 10 * tens.n ColumnA  
FROM x ones,     x tens
WHERE ones.n + 10 * tens.n < 24
ORDER BY ColumnA

答案 2 :(得分:0)

获得24个连续数字的最简单方法是

SELECT TOP 24 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS ColumnA
FROM master..spt_values --pick any table with a sufficient row-count

作为一个初学者,您应该从一开始就尝试学习基于基于集合的的思想。您的代码显示的是过程性思维。

使用基于设置的工具,您必须学会像工具一样思考。

这意味着:

  

没有循环,没有游标,没有执行此操作,然后执行此操作,最后执行该操作。

这意味着:

  

亲爱的引擎,我为您描述了我想要获得的东西,这取决于您如何最好地解决。

更新

只是为了向您展示可能起作用了(但同样,循环在大多数情况下是错误的方法):

-我声明了一个表变量,其作用类似于真实表,但是当超出范围时消失了:

DECLARE @keepNumbers TABLE(ID INT IDENTITY, Nmbr INT);

-您的循环将一个接一个的插入数字

Declare @start int = 1

While(@start <= 24)
Begin 
    INSERT INTO @keepNumbers VALUES(@start);
    set @start = @start + 1 
End

-不,您没有一个包含所有数字的表格

SELECT Nmbr FROM @keepNumbers ORDER BY ID;