Um lugar além da recursão, onde acho as CTEs incrivelmente úteis, é ao criar consultas complexas de relatórios. Uso uma série de CTEs para obter trechos dos dados de que preciso e depois combinar na seleção final. Acho que eles são mais fáceis de manter do que fazer a mesma coisa com muitas tabelas derivadas ou 20 junções e acho que posso ter mais certeza de que eles retornam os dados corretos sem o efeito de vários registros devido aos vários relacionamentos em todas as diferentes junções. Deixe-me dar um exemplo rápido:
;WITH Conferences (Conference_id)
AS
(select m.Conference_id
FROM mydb.dbo.Conference m
WHERE client_id = 10
and Conference_id in
(select Conference_id from mydb.dbo.Expense
where amount <>0
and amount is not null)
)
--select * from Conferences
,MealEaters(NumberMealEaters, Conference_id, AttendeeType)
AS
(Select count(*) as NumberMealEaters, m.Conference_id, AttendeeType
from mydb.dbo.attendance ma
join Conferences m on m.Conference_id = ma.Conference_id
where (ma.meals_consumed>0 or meals_consumed is null)and attended = 1
group by m.Conference_id)
--select * from MealEaters
,Expenses (Conference_id,expense_date, expenseDescription, RecordIdentifier,amount)
AS
(select Conference_id,max(expense_date) as Expense_date, expenseDescription, RecordIdentifier,sum(amount) as amount
FROM
(SELECT Conference_id,expense_date, amount, RecordIdentifier
FROM mydb.dbo.Expense
WHERE amount <> 0
and Conference_id IN
(SELECT Conference_id
FROM mydb.dbo.Conferences )
group by Conference_id, RecordIdentifier) a
)
--select * from Expenses
Select m.Conference_id,me.NumberMealEaters, me.AttendeeType, e.expense_date, e.RecordIdentifier,amount
from Conferences m
join mealeaters me on m.Conference_id = me.Conference_id
join expenses e on e.Conference_id = m.Conference_id
Portanto, separando os diferentes blocos de informações que você deseja, você pode verificar cada parte individualmente (usando as opções comentadas, descomentando cada uma individualmente e executando apenas até a seleção selecionada) e se você precisou fazer uma alteração nas despesas cálculo (neste exemplo), é mais fácil encontrar do que quando todos eles são misturados em uma consulta massiva. Obviamente, as consultas de relatórios reais para as quais uso são geralmente muito mais complicadas do que o exemplo.