Trong PostgreSQL, các truy vấn đệ quy được xây dựng bằng cách chỉ định đầu tiên tập hợp các hàng ( thuật ngữ không đệ quy , tức là những người ở cấp gốc hoặc cấp cuối cùng của hệ thống phân cấp). Các lần lặp tiếp theo (qua thuật ngữ đệ quy , truy vấn phụ sau UNION ALL
) sau đó thêm các hàng vào tập hợp kết quả từ các hàng còn lại trong tập hợp hàng đầu vào cho đến khi không có thêm hàng nào được thêm vào.
Trong trường hợp của bạn, truy vấn phụ ban đầu không được lọc, vì vậy bạn chỉ cần thêm tất cả các hàng trong lần chạy đầu tiên, không để lại gì cho các lần chạy tiếp theo.
Hãy thử những cách sau:
WITH RECURSIVE q AS (
SELECT po.catalog_id,po.sub_tree_id
FROM my_catalog po
WHERE sub_tree_id = 0 -- this initially selects only "root" rows
UNION ALL
SELECT po.catalog_id,po.sub_tree_id
FROM my_catalog po
JOIN q ON q.catalog_id=po.sub_tree_id
)
SELECT * FROM q;