Смежный вопрос: Проверка TSQL на наличие определенной последовательности строк
Я задаю второй вопрос о рекурсии, потому что на этот раз это другая вещь (на мой взгляд), поэтому, пожалуйста, не удаляйте ее.
У меня есть таблица, содержащая значения:
ORDER_ID Previous_STATUS_ID Next_STATUS_ID Create_Date
2 null 1 '2012-01-02'
2 1 2 '2012-01-03'
2 2 3 '2012-01-04'
2 3 1 '2012-01-05'
3 1 2 '2012-01-06'
2 2 3 '2012-01-10'
2 3 5 '2012-01-13'
2 5 1 '2012-01-22'
2 1 2 '2012-01-22'
Это отлично работает:
with change_tree as
(
SELECT order_id,
previous_status_id,
next_status_id,
cast(next_status_id as varchar(max)) as status_path
FROM status_change
WHERE previous_status_id = 5
AND order_id = 2
UNION ALL
SELECT sc.order_id,
sc.previous_status_id,
sc.next_status_id,
ct.status_path + ',' + cast(sc.next_status_id as varchar(max))
FROM status_change sc
JOIN change_tree ct ON ct.next_status_id = sc.previous_status_id AND ct.order_id = sc.order_id
)
SELECT *
FROM change_tree
WHERE status_path = '5,1';
Но если я изменю это так:
with change_tree as
(
SELECT sc.order_id,
sc.previous_status_id,
sc.next_status_id,
cast(sc.next_status_id as varchar(max)) as status_path,
sc.Create_Date as StartDate,
sc.Create_Date as EndDate
FROM status_change sc
WHERE previous_status_id = 1
AND order_id = 2
UNION ALL
SELECT sc.order_id,
sc.previous_status_id,
sc.next_status_id,
ct.status_path + ',' + cast(sc.next_status_id as varchar(max))
sc.Create_Date as StartDate,
st.Create_Date as EndDate
FROM status_change sc
JOIN change_tree ct ON ct.next_status_id = sc.previous_status_id AND ct.order_id = sc.order_id
)
SELECT *
FROM change_tree
WHERE status_path = '1,2,3';
Я получаю максимальную ошибку рекурсии.
Это данные, которые я ожидаю получить:
ORDER_ID StartDate EndDate
2 '2012-01-02' '2012-01-04'
2 '2012-01-05' '2012-01-10'
Это будет сделано в виде отчета. Поэтому я думал о том, чтобы сохранить результаты в другой таблице, а ночью выполнять только те заказы, которые являются новыми или для которых последовательность состояний закончилась.
Итак, в моей таблице отчетов должны быть эти две записи, и после добавления следующей записи в таблицу status_change, например:
ORDER_ID Previous_STATUS_ID Next_STATUS_ID Create_Date
2 2 3 '2012-02-25'
Моя процедура (функция должна добавлять в таблицу отчетов только последнюю последовательность).
Надеюсь, вы поймете мою точку зрения:)