基于交叉

时间:2018-03-13 17:36:57

标签: sql sql-server tsql

我想以下列格式在两列(字母,数字)中插入数据:

A,101
A,102
A,103
A,201
A,202
A,203
...
A,1203
...
B,101
B,102
B,103
....
Z,1203

尝试解决方案:

我能够通过制作两个表,每个表一列来实现这一点。 在第一张表中,我保留了A-Z,因此有26行。

在第二张表中,我保留了数字101,102,103,201,202,203 ...... 1203。

然后我使用了以下查询

Insert into testtable
    select a.letter, n.ID  
    from Alphabet a 
    cross join Number n

select * from Alphabet

我达到了所需的结果,但我对这种乏味的方法感到不满意。 此外,我尝试while循环,但到目前为止失败了。

您能帮助我找到并建议更好的方法来实现这一要求吗?

1 个答案:

答案 0 :(得分:3)

如果您没有数字/计数表,则可以使用临时计数表。

示例

Declare @N1 int = 101
Declare @N2 int = 1203

Select C,N
 From (Select Top (@N2-@N1+1) N=@N1-1+Row_Number() Over (Order By (Select NULL)) From master..spt_values n1, master..spt_values n2 ) A
 Cross Join (Select Top (26) C=char(65-1+Row_Number() Over (Order By (Select NULL))) From master..spt_values n1 ) B
 Order by C,N

返回28,678行

C   N
A   101
A   102
A   103
...
Z   1201
Z   1202
Z   1203