2015-10-25 121 views
2

我有下表。根據列值重複行N次

Table A: 
ID   ProductFK   Quantity  Price 
------------------------------------------------ 
10   1     2   100 
11   2     3   150 
12   1     1   120 
---------------------------------------------- 

我需要根據訂單列值選擇重複行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 

回答

4

你可以做到這一點與遞歸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 

這裏的工作SQLFiddle

Here's a longer explanation of this technique


因爲你輸入過大這個遞歸,你可以使用一個輔助表有「很多」僞行,然後使用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 

(輔助表是從here借用的,它允許每個輸入行高達65536行,並且可以根據需要進行擴展)

這是SQLFiddle的工作。

+0

我得到這個錯誤:在語句完成之前最大遞歸100已經用盡了 –

+0

你擁有的最大'[Order]'值是多少? – Amit

+0

它的變量現在最大值是500 –

4

可以使用一個簡單的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 

上述查詢由指定數目Quantity欄重複每個記錄。

master.dbo.spt_values on type = 'P'


注:
此表用於獲得一個序列號的這是由type='P'條件有硬編碼。

+1

工程精彩,簡單明瞭。 小編輯** master.dbo.spt_values t2上t2.type ='P'和t2.number IncreMan

-1
CREATE TAblE #temp 
(
T_Name  VARCHAR(50), 
T_Times  BIGINT 
) 

INSERT INTO #temp(T_Name,T_Times) VALUES ('ASHISH',4) 
INSERT INTO #temp(T_Name,T_Times) VALUES ('PANKAJ',3) 
INSERT INTO #temp(T_Name,T_Times) VALUES ('RUPESH',2) 
INSERT INTO #temp(T_Name,T_Times) VALUES ('MANISH',5) 

SELECT t.T_Name ,t.T_Times FROM 
(SELECT T_Name,T_Times,CAST(('<val>'+REPLICATE(T_Name+'</val><val>',T_Times-1) 
+'</val>') AS XML)AS X FROM #temp)t CROSS APPLY t.X.nodes('/val')y(z) 

drop table #temp 
+2

請保持你的答案自成體系!經常提到你的博客網站接近垃圾郵件,並沒有真正認爲堆棧溢出有用。 – user0042