Dalam PostgreSQL, kueri rekursif dibuat dengan terlebih dahulu menetapkan inisial kumpulan baris (istilah non-rekursif , yaitu mereka yang berada di akar atau tingkat akhir hierarki). Iterasi berikutnya (selama istilah rekursif , sub-kueri setelah UNION ALL
) kemudian tambahkan baris ke kumpulan hasil dari baris yang tersisa di kumpulan baris masukan sampai tidak ada lagi baris yang ditambahkan.
Dalam kasus Anda, sub-kueri awal tidak difilter sehingga Anda cukup menambahkan semua baris pada proses awal, tanpa meninggalkan apa pun untuk proses berikutnya.
Coba yang berikut ini:
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;