假设我有一个类似
的表格Name Value
Cat 10
Dog 15
现在给出一个输入参数" N",自我联合表" N"通过为每个原始行创建一个值为0到N-1的新列。例如,如果N为2,则结果表应为
Name Value Count
Cat 10 0
Cat 10 1
Dog 15 0
Dog 15 1
如果" N"是4,结果表应该是
Name Value Count
Cat 10 0
Cat 10 1
Cat 10 2
Cat 10 3
Dog 15 0
Dog 15 1
Dog 15 2
Dog 15 3
如何为SQL Server编写一个带有输入参数的SQL语句" N"如上所示制作表格?
由于
答案 0 :(得分:3)
Union在这里是错误的词,CROSS JOIN是需要的。
在大多数平台上,您可以使用递归CTE和交叉连接这样做。
WITH numberList as
(
SELECT <input number here> AS NUM
UNION ALL
SELECT NUM-1
FROM numberList
WHERE NUM-1 >= 0
)
SELECT t.name, t.value, numberList.num
FROM tablename, numberList
如果你期望num很大(例如超过10k)你就不应该这样做。相反(在大多数平台上)你应该创建一个带有生成的索引/序列的临时表。
答案 1 :(得分:1)
一种方法是使用递归cte生成数字并执行交叉连接。
declare @n int = 5;
with nums(n) as (select 0
union all
select n+1 from nums where n < @n-1)
select t.*,num.n
from tablname t
cross join nums num