26

Đã bị mắc kẹt với SQL2000 cho đến nay quá lâu, tôi đã không thực sự có rất nhiều tiếp xúc với biểu thức bảng chung.Để CTE hoặc không CTE

Câu trả lời tôi đã đưa ra here (#4025380)here (#4018793) đã đi ngược dòng chảy ở chỗ họ không sử dụng CTE.

Tôi đánh giá cao việc đệ quy chúng là guốc beez, và có một số truy vấn có thể được đơn giản hóa rất nhiều bằng cách sử dụng chúng, nhưng tại thời điểm nào thì việc sử dụng chúng chỉ phù phiếm? Họ có lợi ích hiệu suất tuyệt vời so với truy vấn con hay tham gia không? Họ có thực sự đơn giản hóa mã và làm cho nó dễ bảo trì hơn không?

Tóm lại, khi nào thực hành tốt là sử dụng CTE trên cú pháp 'nhỏ hơn'.

+0

Cùng có lợi như với nhiều mô hình lập trình khác: chia và chinh phục. Hãy xem qua trang dữ liệu. Một số người sử dụng tốt các CTE để làm cho các truy vấn dễ đọc hơn nhiều. ví dụ. http://odata.stackexchange.com/stackoverflow/s/299/how-long-until-i-get-the-generalist-badge – Jacob

+0

@Jacob đáng để trả lời đúng. –

+1

Chỉ cần cập nhật, bây giờ tôi sử dụng CTE rất nhiều. Việc có thể phá vỡ quy trình thành các bước nhỏ hơn làm cho truy vấn phức tạp dễ đọc hơn nhiều.Nó lưu hoặc lồng mã trong câu lệnh SQL cuối cùng hoặc phải tạo và tham chiếu các khung nhìn bên ngoài. –

Trả lời

21

Thông thường bạn nên sử dụng một CTE qua một subquery bình thường nếu:

  • truy vấn của bạn yêu cầu đệ quy (như bạn đã nói)
  • Các subquery là lớn hay phức tạp
  • Các truy vấn chứa là lớn hay phức tạp
  • Truy vấn phụ được lặp lại (hoặc ít nhất một số truy vấn phụ có thể được đơn giản hóa bằng cách thực hiện các thao tác đơn giản khác nhau trên truy vấn con chung)

Tóm lại, có, chúng làm cho các truy vấn dễ đọc hơn khi được sử dụng tốt.

+0

Mặc dù không nhận được bất kỳ phiếu bầu nào, câu trả lời này tóm tắt các điểm được nêu trong các câu trả lời khác, vì vậy nó được đánh dấu :-) –

3

Chúng là đường cú pháp, ngoại trừ các truy vấn phân cấp/đệ quy.

Tuy nhiên, không phải tất cả mọi thứ có thể được thực hiện đệ quy nên là - tạo ngày qua CTE đệ quy hầu như không tốt hơn một con trỏ - lừa bảng NUMBERS thu nhỏ tốt hơn nhiều.

+0

Tôi không thể tìm thấy câu trả lời của Emtucifor cho thấy sự khác biệt giữa các cách tiếp cận khác nhau để tạo danh sách: ( –

+0

) điểm, không phải tất cả mọi thứ nên sử dụng CTEs, đệ quy hoặc có lẽ một bài tập tốt sẽ được ghi các giải pháp cả hai cách để thực hiện có thể được đo và khả năng đọc có thể được đánh giá –

+0

@webturner:.. Câu trả lời Emtucifor đã làm chính xác điều đó, vì thế phạm vi ngày. Ngoài ra, CTEs không thể hóa -. họ có thể được trên Oracle 10g + mặc dù –

18

Cá nhân, một khi tôi thấy thoải mái khi sử dụng chúng, tôi nghĩ rằng chúng tạo ra mã sạch hơn, dễ đọc hơn. Ví dụ: so sánh câu trả lời của bạn với tôi trên #4018793. Về cơ bản chúng tôi đã làm điều tương tự; Tôi đã sử dụng một CTE và bạn đã không.

câu trả lời của bạn mà không cần CTE:

SELECT 
    course, 
    section, 
    grade, 
    gradeCount 
FROM 
    table 
INNER JOIN 
    (SELECT 
     grade, 
     Max(gradeCount) as MaxGradeCount 
    FROM 
     table 
    ) MaxGrades 
    ON table.grade = MaxGrades.grade 
     AND table.gradeCount = MaxGrades.MaxGradeCount 
ORDER BY 
    table.grade 

câu trả lời của tôi với CTE:

;with cteMaxGradeCount as (
    select 
     grade, 
     max(gradeCount) as MaxGradeCount 
    from @Test 
    group by grade 
) 
select 
    t.course, 
    t.SECTION, 
    t.grade, 
    t.gradeCount 
from cteMaxGradeCount c 
inner join @Test t 
    on c.grade = t.grade 
     and c.MaxGradeCount = t.gradeCount 
order by t.grade 
+5

+1 chỉ có hai ví dụ này cạnh nhau đã cho tôi rất nhiều thông tin chi tiết về CTE –

2

CTE mang lại một nhanh hơn dẫn đến một kịch bản đệ quy. Kết quả của CTE được sử dụng nhiều lần để có được kết quả cuối cùng. Vì vậy, kể từ khi bạn đã thực hiện mệnh đề where của bạn hoặc subquery trong CTE, chắc chắn nó sẽ cho thấy cải thiện hiệu suất.
Tham chiếu: http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx

Chỉ cần lưu ý, trong nhiều trường hợp, bảng tạm thời cho hiệu suất tốt hơn thì CTE cũng vậy, vì vậy bạn cũng nên thử các bảng tạm thời.
Tham chiếu: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/d040d19d-016e-4a21-bf44-a0359fb3c7fb

Các vấn đề liên quan