我有下表
ID | QUANTITY
------------
1 | 3
2 | 2
Run Code Online (Sandbox Code Playgroud)
我需要的是
ID | Ref No.
------------
1 | MyRef1
1 | MyRef2
1 | MyRef3
2 | AnotherRef1
2 | AnotherRef2
Run Code Online (Sandbox Code Playgroud)
即我需要生成表B,其行数与A中的数量相同,并且升序参考号为.在每一行.
我可以用游标或UDF来做,但有更优雅的解决方案吗?
gbn*_*gbn 18
我会假设
就像是:
SELECT * INTO #TableA
FROM
(
SELECT 1 AS ID, 3 AS QUANTITY, 'MyRef' AS refColumn
UNION ALL
SELECT 2, 2, 'AnotherRef'
) T
;WITH Nbrs ( Number ) AS (
SELECT 1 UNION ALL
SELECT 1 + Number FROM Nbrs WHERE Number < 99
)
SELECT
A.ID, A.refColumn + CAST(N.Number AS varchar(10))
FROM
#TableA A
JOIN
Nbrs N ON N.Number <= A.QUANTITY
Run Code Online (Sandbox Code Playgroud)
这将在SQL Server 2005+中创建您想要的行数,但我不确定您要如何确定MyRef和AnotherRef应该是什么...
WITH
expanded
AS
(
SELECT id, Quantity FROM myTable
UNION ALL
SELECT id, Quantity - 1 FROM expanded WHERE Quantity > 1
)
SELECT
*,
ROW_NUMBER() OVER (ORDER BY id, Quantity) AS unique_ref
FROM
expanded
ORDER BY
id,
Quantity
Run Code Online (Sandbox Code Playgroud)
这也能达到目的。它使用递归,创建一个包含 1-100 行的表。
WITH NBR ( NUM ) AS (
SELECT 1 UNION ALL
SELECT 1 + NUM FROM NBR
WHERE NUM < 100
)
SELECT * into NUMBERS from NBR
Run Code Online (Sandbox Code Playgroud)