是否可能有一系列数字,例如:
1,2,3,4,5
创建/打印金字塔,如:
1
1,2 1,2,3 1,2,3,4 1,2,3,4,5
这可以通过循环轻松完成,但我想避免使用它们。
到目前为止,我的解决方案是动态创建每一行的选择字符串,并union
所有行以获得所需的结果。例如:
-- @Line1 = '1,
select @Line1 = coalesce(@Line1 + ',', '') + Num
from Numbers
where Num < 2
-- @Line2 = '1, 2,'
select @Line2 = coalesce(@Line2 + ',', '') + Num
from Numbers
where Num < 3
select @Line1
union
select @Line2
.
.
.
并执行它。代码不完整,但我认为它给出了我正在尝试的内容。
关于如何改进它的任何想法?
相关:How do I print a triangle of stars using SQL
注意:这可能没有实际用途。我发现这是一种各种语言的练习,所有人都提出了循环解决方案。我认为在SQL Server中尝试它会很有趣。
答案 0 :(得分:3)
试试这个
WITH Numbers AS
(
SELECT TOP 5
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nr
FROM master..spt_values
)
SELECT STUFF(
(
SELECT ',' + CAST(x.Nr AS VARCHAR(10))
FROM Numbers AS x
WHERE x.Nr<=Numbers.Nr
FOR XML PATH('')
),1,1,''
) AS Result
FROM Numbers
结果
Result
1
1,2
1,2,3
1,2,3,4
1,2,3,4,5
答案 1 :(得分:3)
如果您有以下内容,这相对容易:
STRING_AGG
将添加到下一版本的SQL Server中(即 2016之后的)。有各种技术来创造这样的功能。链接的文章显示了各种选项,使用SQLCLR,XML运算符,CTE,游标等。fastes方法是SQLCLR。假设连接方法是GROUP_CONCAT()
,您可以写:
select o.n,dbo.GROUP_CONCAT_S(x.n) as Result
from numbers o outer apply (select n from numbers i where i.n<=o.n) x
where o.n<=5
group by o.n
这将返回:
n Result
----------- ----------
1 1
2 1,2
3 1,2,3
4 1,2,3,4
5 1,2,3,4,5
答案 2 :(得分:2)
我将此作为第二个答案,因为这是一种完全不同的方法:
递归CTE只不过是隐藏RBAR (所以隐形循环)。但它是 - 嗯 - 嗯 - 更漂亮: - )
$(".producttable").click