fra*_*tti 9 sql t-sql repeat sql-server-2008
我有下表.
Table A:
ID ProductFK Quantity Price
------------------------------------------------
10 1 2 100
11 2 3 150
12 1 1 120
----------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我需要根据订单列值选择重复行N次.
所以我需要以下选择结果:
ID ProductFK Quantity Price
------------------------------------------------
10 1 1 100
10 1 1 100
11 2 1 150
11 2 1 150
11 2 1 150
12 1 1 120
Run Code Online (Sandbox Code Playgroud)
Siy*_*mdi 26
您可以使用简单的JOIN方法获得所需的结果,如下所示:
SELECT t1.*, t2.number + 1 RepeatNumber
FROM TableA t1
JOIN master.dbo.spt_values t2 ON t2.type = 'P' AND t2.number < t1.Quantity
Run Code Online (Sandbox Code Playgroud)
上述查询按Quantity列中指定的数字重复每条记录.
注意master.dbo.spt_values on type = 'P':
此表用于获取一系列由其
条件硬编码的数字type = 'P'.
您可以使用递归CTE执行此操作UNION ALL:
;WITH cte AS
(
SELECT * FROM Table1
UNION ALL
SELECT cte.[ID], cte.ProductFK, (cte.[Order] - 1) [Order], cte.Price
FROM cte INNER JOIN Table1 t
ON cte.[ID] = t.[ID]
WHERE cte.[Order] > 1
)
SELECT [ID], ProductFK, 1 [Order], Price
FROM cte
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)
这是一个有效的SQLFiddle.
由于您的输入对于此递归来说太大,您可以使用辅助表来获得"许多"虚拟行,然后SELECT TOP([Order])用于每个输入行(CROSS APPLY):
;WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),
E02(N) AS (SELECT 1 FROM E00 a, E00 b),
E04(N) AS (SELECT 1 FROM E02 a, E02 b),
E08(N) AS (SELECT 1 FROM E04 a, E04 b),
E16(N) AS (SELECT 1 FROM E08 a, E08 b)
SELECT t.[ID], t.ProductFK, 1 [Order], t.Price
FROM Table1 t CROSS APPLY (
SELECT TOP(t.[Order]) N
FROM E16) ca
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)
(辅助表从这里借用,每个输入行最多允许65536行,如果需要可以扩展)
这是一个有效的SQLFiddle.
| 归档时间: |
|
| 查看次数: |
19447 次 |
| 最近记录: |