CTE không tạo ra bất cứ điều gì 'thực tế'. Chúng chỉ đơn thuần là một phần tử , một cách để biểu diễn một biểu thức bảng sẽ được sử dụng, có thể nhiều lần, trong một câu lệnh. Khi bạn nói
WITH cteFoo AS (select ... from table where ...)
select ... from cteFoo where ...
chỉ là một cách khác để nói
select ... from (select ... from table where ....) as cteFoo where ...
CTE và bảng có nguồn gốc rất giống nhau, bất kỳ truy vấn sử dụng bảng có nguồn gốc có thể được rewriten như một CTE, và bất kỳ CTE không đệ quy có thể được viết lại dưới dạng truy vấn bằng cách sử dụng các bảng có nguồn gốc. Cá nhân, tôi nhiều hơn preffer các hình thức CTE là ngắn gọn hơn và dễ đọc.
CTEs cho phép một biểu bảng được sử dụng nhiều lần để được tuyên bố chỉ một lần:
WITH cte AS (select ... from table where ...)
select ...
from cte a join cte b on ...
where ...
Hãy so sánh điều này với các hình thức bảng có nguồn gốc ngữ nghĩa tương tự:
select ...
from (
select ... from table where ...) as a
join (
select ... from table where ...) as b
on ...
where ...
Các CTE rõ ràng là dễ đọc hơn. Nhưng bạn phải hiểu rằng hai biểu mẫu này đang tạo ra cùng một truy vấn. Dạng CTE có thể gợi ý rằng một kết quả trung gian được tạo ra sau đó kết nối được chạy trên kết quả trung gian, nhưng điều này không đúng. Các hình thức CTE được biên dịch thành chính xác cùng một hình thức như một bảng dẫn xuất, mà làm cho rõ ràng thực tế là bảng exe của CTE được chạy hai lần.
Nguồn
2009-10-19 22:11:55
Đây là một ví dụ tốt về lý do tại sao tất cả chúng ta nên sử dụng dấu chấm phẩy trong T-SQL của chúng tôi. Có ';' được đặt đúng sau câu lệnh UPDATE và DELETE làm cho rõ ràng rằng CTE là _part of_ câu lệnh UPDATE. – NReilingh