本文介紹了按列值重復行N次,重復次數不限的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我在SQL Server 2014中有一個類似的表:
IDSupply Qty PartName
---------------------------
1 2 C
2 4 B
3 50000 A
我想根據帶有索引的數量列將每行重復N次(例如,將C從1到4作為索引)
問題是什么:我為這個目標使用了2個查詢,但它們只重復了100次,如下所示:
WITH tally AS
(
SELECT 1 n
UNION ALL
SELECT n + 1
FROM tally
)
SELECT partname, n.n Position
FROM supplylist t
JOIN tally n ON n.n <= t.qty
ORDER BY partname, Position
和其他方法可以將每行重復32000次,但我不能將其用作CTE(因為CTE有OPTION(MAXRECURSION 32500)
問題)
WITH Numbers(Num) AS
(
SELECT 1 AS Num
UNION ALL
SELECT Num + 1
FROM Numbers c
WHERE c.Num < 30000
)
SELECT partname, qty, num
FROM supplylist
JOIN Numbers ON supplylist.qty >= Numbers.Num
ORDER BY partname, num
OPTION(MAXRECURSION 32500)
注意:我不能在CTE結構中使用上述代碼,如下所示:
WITH Numbers(Num) AS
(
SELECT 1 AS Num
UNION ALL
SELECT Num + 1
FROM Numbers c
WHERE c.Num < 30000
),
CTE as
(
SELECT partname,qty, num
FROM supplylist
JOIN Numbers ON supplylist.qty >= Numbers.Num
ORDER BY partname, num
OPTION(MAXRECURSION 32500)
)
SELECT *
FROM CTE
請幫助我做到這一點,沒有限制,沒有CTE結構的問題。
推薦答案
芬利我找到了解決方案。我們不能在CTE結構中使用”Option(MAXRECURSION 0)”,但可以將查詢用作函數,并使用”Option(MAXRECURSION 0)”調用和運行如下函數:
Create fnCreateIndex
(
@Pr1 Int
)
RETURNS TABLE
AS
RETURN
(
WITH Numbers(Num) AS
(
SELECT 1 AS Num
UNION ALL
SELECT Num + 1
FROM Numbers c
WHERE c.Num < @Pr1),
CTE as
(
SELECT partname, qty, num
FROM supplylist
JOIN Numbers ON supplylist.qty >= Numbers.Num
)
Select * from cte
)
最后,我們可以使用它來獲得結果:
select * from fnCreateIndex (50000) order by partname, num OPTION(MAXRECURSION 0)
我根據https://stackoverflow.com/a/7428903/4885037
找到解決方案
這篇關于按列值重復行N次,重復次數不限的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,