CTE не проходит рекурсию - PullRequest
0 голосов
/ 26 июля 2011

Я впервые использую 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

1 Ответ

3 голосов
/ 26 июля 2011

Ваш 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 в примере кода, но в основном использую это соединение, чтобы определить, как соотносятся строки.

...