SQL:如何自我联合任意时间

时间:2016-07-05 16:47:36

标签: sql sql-server

假设我有一个类似

的表格
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"如上所示制作表格?

由于

2 个答案:

答案 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
相关问题