WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part2 cung cấp một cách để viết các câu lệnh phụ trợ để sử dụng trong một truy vấn lớn hơn. Các câu lệnh này, thường được gọi là Biểu thức bảng chung hoặc CTE, có thể được coi là xác định các bảng tạm thời chỉ tồn tại cho một truy vấn. Mỗi mệnh đề phụ trợ trong mệnh đề
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part2 có thể là một
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part4,
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part5,
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part6, hoặc
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part7;
Công cụ sửa đổi
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part13 tùy chọn thay đổi
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part2 từ một tiện ích cú pháp đơn thuần thành một tính năng hoàn thành những điều không thể có trong SQL tiêu chuẩn. Sử dụng
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part13, truy vấn
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part2 có thể tham chiếu đến đầu ra của chính nó. Một ví dụ rất đơn giản là truy vấn này để tính tổng các số nguyên từ 1 đến 100
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part5
Dạng tổng quát của truy vấn
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part2 đệ quy luôn là một thuật ngữ không đệ quy, sau đó là
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part18 [hoặc
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part19], sau đó là thuật ngữ đệ quy, trong đó chỉ thuật ngữ đệ quy mới có thể chứa tham chiếu đến đầu ra của chính truy vấn. Một truy vấn như vậy được thực hiện như sau
Đánh giá truy vấn đệ quy
Đánh giá thuật ngữ không đệ quy. Đối với
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part
18 [nhưng không phảiWITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part
19], hãy loại bỏ các hàng trùng lặp. Bao gồm tất cả các hàng còn lại trong kết quả của truy vấn đệ quy, đồng thời đặt chúng vào một bảng làm việc tạm thờiMiễn là bàn làm việc không trống, hãy lặp lại các bước này
Đánh giá thuật ngữ đệ quy, thay thế nội dung hiện tại của bảng làm việc cho tự tham chiếu đệ quy. Đối với
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part
18 [nhưng không phảiWITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part
19], hãy loại bỏ các hàng trùng lặp và các hàng trùng lặp với bất kỳ hàng kết quả nào trước đó. Bao gồm tất cả các hàng còn lại trong kết quả của truy vấn đệ quy, đồng thời đặt chúng vào một bảng trung gian tạm thờiThay thế nội dung của bảng làm việc bằng nội dung của bảng trung gian, sau đó làm trống bảng trung gian
Ghi chú
Mặc dù
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part13 cho phép các truy vấn được chỉ định theo cách đệ quy, nhưng bên trong các truy vấn đó được đánh giá lặp đi lặp lại
Trong ví dụ trên, bảng làm việc chỉ có một hàng trong mỗi bước và nó nhận các giá trị từ 1 đến 100 trong các bước liên tiếp. Ở bước thứ 100, không có đầu ra do mệnh đề
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part45 và do đó truy vấn kết thúc
Truy vấn đệ quy thường được sử dụng để xử lý dữ liệu có cấu trúc phân cấp hoặc cây. Một ví dụ hữu ích là truy vấn này để tìm tất cả các phần phụ trực tiếp và gián tiếp của một sản phẩm, chỉ cung cấp một bảng hiển thị các phần bao gồm ngay lập tức
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part
Khi tính toán duyệt cây bằng truy vấn đệ quy, bạn có thể muốn sắp xếp các kết quả theo thứ tự chiều sâu hoặc chiều rộng trước. Điều này có thể được thực hiện bằng cách tính toán một cột thứ tự cùng với các cột dữ liệu khác và sử dụng cột đó để sắp xếp kết quả ở cuối. Lưu ý rằng điều này không thực sự kiểm soát thứ tự đánh giá truy vấn truy cập các hàng; . Cách tiếp cận này chỉ cung cấp một cách thuận tiện để sắp xếp các kết quả sau đó
Để tạo thứ tự theo chiều sâu, chúng tôi tính toán cho mỗi hàng kết quả một mảng các hàng mà chúng tôi đã truy cập cho đến nay. Ví dụ: xem xét truy vấn sau tìm kiếm bảng
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part46 bằng trường
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part47
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part1
Để thêm thông tin đặt hàng theo chiều sâu, bạn có thể viết cái này
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part4
Trong trường hợp chung khi cần sử dụng nhiều trường để xác định một hàng, hãy sử dụng một mảng các hàng. Ví dụ: nếu chúng tôi cần theo dõi các trường
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part48 và
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part49
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part2
Mẹo
Bỏ qua cú pháp
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part20 trong trường hợp phổ biến khi chỉ cần theo dõi một trường. Điều này cho phép sử dụng một mảng đơn giản thay vì một mảng kiểu hỗn hợp, đạt được hiệu quả
Để tạo thứ tự tìm kiếm theo chiều rộng, bạn có thể thêm một cột theo dõi độ sâu của tìm kiếm chẳng hạn
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part4
Để sắp xếp ổn định, hãy thêm các cột dữ liệu làm cột sắp xếp phụ
Mẹo
Thuật toán đánh giá truy vấn đệ quy tạo ra kết quả của nó theo thứ tự tìm kiếm theo chiều rộng. Tuy nhiên, đây là một chi tiết triển khai và có lẽ không hợp lý khi dựa vào nó. Thứ tự của các hàng trong mỗi cấp chắc chắn không được xác định, do đó, một số thứ tự rõ ràng có thể được mong muốn trong mọi trường hợp
Có cú pháp tích hợp để tính toán cột sắp xếp theo chiều sâu hoặc chiều rộng. Ví dụ
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part5
Cú pháp này được mở rộng nội bộ thành một cái gì đó tương tự như các biểu mẫu viết tay ở trên. Mệnh đề
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part21 chỉ định tìm kiếm đầu tiên theo chiều sâu hay chiều rộng, danh sách các cột cần theo dõi để sắp xếp và tên cột sẽ chứa dữ liệu kết quả có thể được sử dụng để sắp xếp. Cột đó sẽ được thêm hoàn toàn vào các hàng đầu ra của CTE
Khi làm việc với các truy vấn đệ quy, điều quan trọng là phải đảm bảo rằng phần đệ quy của truy vấn cuối cùng sẽ không trả về bộ dữ liệu nào, nếu không, truy vấn sẽ lặp vô thời hạn. Đôi khi, sử dụng
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part18 thay vì
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part19 có thể thực hiện việc này bằng cách loại bỏ các hàng trùng lặp các hàng đầu ra trước đó. Tuy nhiên, thường thì một chu kỳ không liên quan đến các hàng đầu ra hoàn toàn trùng lặp. có thể chỉ cần kiểm tra một hoặc một vài trường để xem liệu điểm tương tự đã đạt được trước đó chưa. Phương pháp tiêu chuẩn để xử lý các tình huống như vậy là tính toán một mảng các giá trị đã truy cập. Ví dụ: hãy xem xét lại truy vấn sau tìm kiếm bảng
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part24 bằng trường
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part47
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part1
Truy vấn này sẽ lặp lại nếu mối quan hệ
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part47 chứa chu trình. Bởi vì chúng tôi yêu cầu đầu ra "độ sâu", chỉ cần thay đổi
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part19 thành
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part18 sẽ không loại bỏ vòng lặp. Thay vào đó, chúng ta cần nhận ra liệu chúng ta có quay lại cùng một hàng hay không khi đi theo một đường liên kết cụ thể. Chúng tôi thêm hai cột
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part29 và
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part40 vào truy vấn dễ bị lặp
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part7
Ngoài việc ngăn chặn các chu kỳ, giá trị mảng thường hữu ích theo cách riêng của nó khi đại diện cho “đường dẫn” được thực hiện để đến bất kỳ hàng cụ thể nào
Trong trường hợp chung khi cần kiểm tra nhiều trường để nhận ra một chu kỳ, hãy sử dụng một mảng các hàng. Ví dụ: nếu chúng tôi cần so sánh các trường
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part48 và
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part49
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part0
Mẹo
Bỏ qua cú pháp
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part20 trong trường hợp phổ biến khi chỉ cần kiểm tra một trường để nhận biết chu trình. Điều này cho phép sử dụng một mảng đơn giản thay vì một mảng kiểu hỗn hợp, đạt được hiệu quả
Có cú pháp tích hợp để đơn giản hóa việc phát hiện chu kỳ. Truy vấn trên cũng có thể được viết như thế này
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part0
và nó sẽ được viết lại nội bộ thành mẫu trên. Mệnh đề
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part44 trước tiên chỉ định danh sách các cột cần theo dõi để phát hiện chu kỳ, sau đó là tên cột sẽ hiển thị liệu một chu kỳ đã được phát hiện hay chưa và cuối cùng là tên của một cột khác sẽ theo dõi đường dẫn. Các cột chu trình và đường dẫn sẽ được thêm hoàn toàn vào các hàng đầu ra của CTE
Mẹo
Cột đường chu trình được tính theo cách tương tự như cột thứ tự ưu tiên độ sâu hiển thị trong phần trước. Một truy vấn có thể có cả mệnh đề
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part21 và mệnh đề
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part44, nhưng đặc tả tìm kiếm theo chiều sâu và đặc tả phát hiện chu trình sẽ tạo ra các tính toán dư thừa, do đó, sẽ hiệu quả hơn nếu chỉ sử dụng mệnh đề
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part44 và sắp xếp theo cột đường dẫn. Nếu muốn đặt hàng theo chiều rộng, thì việc chỉ định cả
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part21 và
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part44 có thể hữu ích
Một thủ thuật hữu ích để kiểm tra các truy vấn khi bạn không chắc liệu chúng có thể lặp hay không là đặt một _____350 trong truy vấn gốc. Ví dụ: truy vấn này sẽ lặp mãi nếu không có
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part50
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part1
Điều này hiệu quả vì quá trình triển khai của PostgreSQL chỉ đánh giá số hàng của truy vấn
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part2 như số hàng thực sự được tìm nạp bởi truy vấn gốc. Không nên sử dụng thủ thuật này trong sản xuất vì các hệ thống khác có thể hoạt động khác. Ngoài ra, nó thường không hoạt động nếu bạn thực hiện truy vấn bên ngoài sắp xếp kết quả của truy vấn đệ quy hoặc nối chúng với một số bảng khác, bởi vì trong những trường hợp như vậy, truy vấn bên ngoài thường sẽ cố gắng tìm nạp tất cả đầu ra của truy vấn
WITH RECURSIVE included_parts[sub_part, part, quantity] AS [ SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity * pr.quantity FROM included_parts pr, parts p WHERE p.part = pr.sub_part ] SELECT sub_part, SUM[quantity] as total_quantity FROM included_parts GROUP BY sub_part2.