需要根据列中的值生成n行

Ric*_*ght 13 t-sql sql-server

我有下表

表A.

ID | QUANTITY
------------
1  | 3
2  | 2
Run Code Online (Sandbox Code Playgroud)

我需要的是

表B

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

我会假设

  1. MyRef等是TableA中的一列
  2. 你有一个数字

就像是:

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)

  • @gbn - 数字表链​​接似乎是垃圾邮件 - 它指的是什么? (2认同)

Mat*_*lie 9

这将在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)


ash*_*dri 8

这也能达到目的。它使用递归,创建一个包含 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)