2011-07-26 125 views
0

我第一次使用CTE,並遇到一些困難。我在網上查找,並試圖拼湊出一些例子。CTE不通過遞歸

我想插入行之間的每兩行返回帳戶的所有天。行1有日期(A),行2有日期(B)。我想在A和B之間每天插入一行,其中這些行都與第1行具有相同的值。

如果我只對我的測試數據運行我的錨點定義,我得到341行。運行CTE後,我得到682.所以它只運行一次。

任何建議,你可以提供將是偉大的。謝謝。

我有以下表模式:

field1 (varchar(10)) field2 (smalldatetime) field3 (numeric(18,0)) field4 (numeric(18,6)) field5 (numeric(18,6)) field6 (numeric(18,3)) 

輸入表的一個例子是:

ABC 1-1-1990 0 0.1 0.1 0.125 
ABC 1-5-1990 1 0.2 0.2 1.0 
ABC 1-9-1990 0 0.3 0.3 0.750 
ABC 1-13-1990 1 0.4 0.4 1.500 

我想將其轉換成這樣:

ABC 1-1-1990 0 0.1 0.1 0.125 
ABC 1-2-1990 0 0.1 0.1 0.125 
ABC 1-3-1990 0 0.1 0.1 0.125 
ABC 1-4-1990 0 0.1 0.1 0.125 
ABC 1-5-1990 1 0.2 0.2 1.0 
ABC 1-6-1990 1 0.2 0.2 1.0 
ABC 1-7-1990 1 0.2 0.2 1.0 
ABC 1-8-1990 1 0.2 0.2 1.0 
ABC 1-9-1990 0 0.3 0.3 0.750 
ABC 1-10-1990 0 0.3 0.3 0.750 
ABC 1-11-1990 0 0.3 0.3 0.750 
ABC 1-12-1990 0 0.3 0.3 0.750 
ABC 1-13-1990 1 0.4 0.4 1.500 

這裏我現在的CTE:

WITH NewData (field1,field2,field3,field4,field5,field6) AS   
(  
    SELECT m.field1,m.field2,m.field3,m.field4,m.field5,m.field6 
    FROM MyTable as m 
    WHERE m.field1 is not null   
    GROUP BY m.field1,m.field2,m.field3,m.field4,m.field5,m.field6  
    UNION ALL   
    SELECT m.field1, DATEADD(d, 1, m.field2), m.field3, m.field4, m.field5, m.field6 
    FROM MyTable as m    
) 
SELECT field1,field2,field3, field4, field5,field6  
FROM NewData 
order by field1, field2 
OPTION(MAXRECURSION 0) 

電流輸出(缺少日期1-3-1990,1-4-1990,1-7-1990,1-8-1990,1-11-1990,1-12-1990):

ABC 1-1-1990 0 0.1 0.1 0.125 
ABC 1-2-1990 0 0.1 0.1 0.125 
ABC 1-5-1990 1 0.2 0.2 1.0 
ABC 1-6-1990 1 0.2 0.2 1.0 
ABC 1-9-1990 0 0.3 0.3 0.750 
ABC 1-10-1990 0 0.3 0.3 0.750 
ABC 1-13-1990 1 0.4 0.4 1.500 

回答

3

您的CTE目前沒有被定義爲遞歸的,因爲您認爲遞歸的部分並不是因爲它沒有引用它自己 - 所以它只是一個普通的聯合查詢(所以你得到更多的行,讓你認爲它是遞歸的,當它只是一個工會)

http://msdn.microsoft.com/en-us/library/ms186243.aspx

WITH NewData (field1,field2,field3,field4,field5,field6) AS   
( 
SELECT m.field1,m.field2,m.field3,m.field4,m.field5,m.field6  
FROM MyTable as m  
WHERE m.field1 is not null    
GROUP BY m.field1,m.field2,m.field3,m.field4,m.field5,m.field6   
UNION ALL    
SELECT m.field1, DATEADD(d, 1, m.field2), m.field3, m.field4, m.field5, m.field6  
FROM MyTable as m 
INNER JOIN NewData n on n.field1 = m.field1 
) 

我不完全確定你想要遞增的連接條件,所以在代碼示例中只使用了field1,但基本上使用該連接來定義行之間的關係。

+0

感謝您的回覆。我正在嘗試退出smalldatetime字段(field2)。我想獲取第1行的日期,第2行的日期,並遞歸添加一天到第1行插入一行,直到我到達第2行的日期。一旦到達第2行的日期,CTE應該移動到第2行和第3行從最初的數據集...等等 – Ken

+0

這並不完全正常,就遞歸而言,必須擊中實際行,而不是在中間創建行。如果你有預建的日曆表(如數字表),那麼你可能會破解它的工作。 – Andrew