2016-05-11 4 views
1

У меня есть таблица, как показано нижеPostgreSQL рекурсивного запроса, чтобы получить категорию и подкатегории

enter image description here

Использования рекурсивного заявления я могу получить глубину стола

WITH RECURSIVE category_tree(id, name, depth) AS (
    SELECT id, name, ARRAY[id] 
    FROM category 
    WHERE parentid IS NULL 
UNION ALL 
    SELECT category.id, category.name, depth || category.id 
    FROM category_tree 
    JOIN category ON category.parentid=category_tree.id 
    WHERE NOT category.id = ANY(depth) 
) 
SELECT * FROM category_tree ORDER BY id; 

Как должен ли я изменить запрос так, чтобы я мог получить результат, как показано ниже (до n-го уровня дерева)?

enter image description here

Я намерен использовать полученный результат для создания карты сайта, как показано ниже:

enter image description here

В настоящее время я пытаюсь использовать LEFT OUTER JOIN с рекурсивным заявлением, но я не удалось найти способ? Может ли кто-нибудь помочь?

+1

Что делать, если у вас есть 4 или 5 уровней? Вы проигнорируете эти данные? – trincot

+0

Нет. Я не собираюсь игнорировать эти данные, поэтому я пытаюсь использовать инструкцию RECURSIVE, чтобы я мог получить до n-го уровня. – praveen

+1

Значит, вы не знаете количество столбцов, которое у вас будет на вашем выходе? Я боюсь, что это невозможно, если вы не построите SQL динамически. – trincot

ответ

1

Для формата вывода, который вы описываете, я бы не пошел на рекурсивный запрос. Рекурсивные запросы производят строки, которые вам нужно будет поворачивать, чтобы добраться до вашего формата. В сводном запросе вам нужно указать, какие столбцы у вас будут. В целом, это становится длинным запросом, а для вывода с 4 или 5 столбцами следующее будет более простым:

SELECT c0.name AS root_name, 
      c1.name AS down1_name, 
      c2.name AS down2_name, 
      c3.name AS down3_name, 
      c4.name AS down4_name, 
      c5.name AS down5_name 
FROM  category c0 
LEFT JOIN category c1 ON c1.parentid = c0.id 
LEFT JOIN category c2 ON c2.parentid = c1.id 
LEFT JOIN category c3 ON c3.parentid = c2.id 
LEFT JOIN category c4 ON c4.parentid = c3.id 
LEFT JOIN category c5 ON c5.parentid = c4.id 
WHERE  c0.parentid IS NULL 
ORDER BY c0.id, c1.id, c2.id, c3.id, c4.id, c5.id 

 Смежные вопросы

  • Нет связанных вопросов^_^