Neben der Rekursion finde ich CTEs unglaublich nützlich, wenn komplexe Berichtsabfragen erstellt werden. Ich benutze eine Reihe von CTEs, um die benötigten Daten zu erhalten und sie dann in der endgültigen Auswahl zu kombinieren. Ich finde, dass sie einfacher zu pflegen sind, als dasselbe mit vielen abgeleiteten Tabellen oder 20 Joins zu tun, und ich kann mir sicherer sein, dass sie aufgrund der Eins-zu-Viele-Beziehungen in die richtigen Daten ohne Auswirkung mehrerer Datensätze zurückgeben all die verschiedenen Joins. Lassen Sie mich ein kurzes Beispiel geben:
;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
Wenn Sie also die verschiedenen gewünschten Informationsblöcke herausfiltern, können Sie jedes Teil einzeln überprüfen (indem Sie die auskommentierten Auswahlen verwenden, jedes einzeln auskommentieren und nur bis zu dieser Auswahl ausführen) und wenn Sie eine Änderung an den Ausgaben vornehmen müssen Berechnung (in diesem Beispiel) ist es einfacher zu finden, als wenn sie alle zu einer massiven Abfrage zusammengemischt werden. Natürlich sind die tatsächlichen Berichtsabfragen, für die ich dies verwende, im Allgemeinen viel komplizierter als das Beispiel.