Một nơi bên cạnh đệ quy nơi tôi thấy CTE cực kỳ hữu ích là khi tạo các truy vấn báo cáo phức tạp. Tôi sử dụng một loạt các CTE để lấy các khối dữ liệu tôi cần và sau đó kết hợp trong lựa chọn cuối cùng. Tôi thấy chúng dễ bảo trì hơn so với thực hiện cùng một thứ với nhiều bảng dẫn xuất hoặc 20 phép nối và tôi thấy rằng tôi có thể yên tâm hơn rằng nó trả về dữ liệu chính xác mà không ảnh hưởng đến nhiều bản ghi do có nhiều mối quan hệ trong tất cả các tham gia khác nhau. Hãy để tôi đưa ra một ví dụ nhanh:
;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
Vì vậy, bằng cách tách ra các khối thông tin khác nhau mà bạn muốn, bạn có thể kiểm tra từng phần riêng lẻ (sử dụng các lựa chọn nhận xét, bằng cách bỏ qua từng phần riêng lẻ và chỉ chạy theo lựa chọn đó) và nếu bạn cần thay đổi chi phí tính toán (trong ví dụ này), nó dễ tìm hơn so với khi tất cả chúng được trộn với nhau thành một truy vấn lớn. Tất nhiên các truy vấn báo cáo thực tế tôi sử dụng này thường phức tạp hơn nhiều so với ví dụ.