Tạo danh sách đệ quy python

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
2 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_part
2 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_part
4,
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
5,
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
6, 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_part
7;

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_part
13 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_part
2 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_part
13, 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_part
2 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_part
5

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_part
2 đệ 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_part
18 [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_part
19], 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

  1. Đá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ả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
    
    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ời

  2. Miễn là bàn làm việc không trống, hãy lặp lại các bước này

    1. Đá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ả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
      
      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ời

    2. Thay 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_part
13 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_part
45 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_part
46 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_part
47

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
1

Để 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_part
4

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_part
48 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_part
49

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
2

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_part
20 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_part
4

Để 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_part
5

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_part
21 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_part
18 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_part
19 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_part
24 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_part
47

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
1

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_part
47 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_part
19 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_part
18 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_part
29 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_part
40 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_part
7

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_part
48 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_part
49

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
0

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_part
20 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_part
0

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_part
44 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_part
21 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_part
44, 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_part
44 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_part
21 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_part
44 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_part
50

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
1

Đ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_part
2 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_part
2.

Chủ Đề