Рекурсивні CTE (Common Table Expressions) в PostgreSQL є потужним засобом для роботи з ієрархічними даними. Цією статтею ми детально розглянемо, як створити рекурсивний CTE-запит для отримання всіх батьківських постів від дитячого поста до кореневого в PostgreSQL.
Припустимо, що у нас є таблиця Post з наступною структурою:
1 2 3 4 5 6 7 |
CREATE TABLE Post ( id SERIAL PRIMARY KEY, text TEXT NOT NULL, parent_id INTEGER REFERENCES Post(id) ); |
Ми бажаємо отримати всі пости від дитячого поста (за його id) до кореневого поста (де parent_id є null).
Для цього використовується рекурсивний CTE-запит:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
WITH RECURSIVE post_tree AS ( SELECT id, text, parent_id FROM Post WHERE id = 'your_child_post_id' -- Замініть 'your_child_post_id' на фактичний id дитячого поста UNION SELECT p.id, p.text, p.parent_id FROM Post p JOIN post_tree pt ON p.id = pt.parent_id ) SELECT id, text, parent_id FROM post_tree; |
У цьому запиті ми використовуємо рекурсивний CTE під назвою post_tree
. Спочатку ми вибираємо дані для дитячого поста, а потім рекурсивно приєднуємо батьківські пости, поки не досягнемо кореневого поста.
Основна ідея полягає в тому, що ми об’єднуємо пости за їхніми parent_id, знову і знову, поки не досягнемо кореневого поста (де parent_id є null).