Рекурсивные подзапросы

Путь до элемента

В прошлом задании мы построили иерархию каталогов товаров:

WITH RECURSIVE lv_hierarchy AS (
  SELECT c.category_id,
         c.parent_category_id,
         c.name,
         1 AS level
    FROM category c
   WHERE c.parent_category_id IS NULL

   UNION ALL

  SELECT c.category_id,
         c.parent_category_id,
         c.name,
         p.level + 1 AS level
    FROM lv_hierarchy p,
         category c
   WHERE c.parent_category_id = p.category_id
)
SELECT *
  FROM lv_hierarchy
#category_idparent_category_idnamelevel
11NULLТовары для дома1
22NULLЦифровая техника1
331Бытовая техника2
442Ноутбуки и аксессуары2
552Фотоаппараты2
662Игровые консоли2
772Аудиотехника2
882Сотовые телефоны2
994Ноутбуки3
10104Рюкзаки3

Отобразим путь до каталога (так называемые "хлебные крошки"). Например, для ноутбуков должно получиться

/Цифровая техника/Ноутбуки и аксессуары/Ноутбуки

Для "Ноутбуки и аксессуары":

/Цифровая техника/Ноутбуки и аксессуары

С помощью рекурсивных запросов построить такой путь довольно просто. Для родительских каталогов (получаем их в нерекурсивной части подзапроса) путь равен

/ + название каталога  

Для вложенных каталогов (в рекурсивной части подзапроса):

путь до родителя + / + название каталога

Доработаем наш запрос по вышеизложенному алгоритму:

WITH RECURSIVE lv_hierarchy AS (
  SELECT c.category_id,
         c.parent_category_id,
         c.name,
         1 AS level,
         '/' || c.name AS path
    FROM category c
   WHERE c.parent_category_id IS NULL

   UNION ALL

  SELECT c.category_id,
         c.parent_category_id,
         c.name,
         p.level + 1 AS level,
         p.path || '/' || c.name AS path
    FROM lv_hierarchy p,
         category c
   WHERE c.parent_category_id = p.category_id
)
SELECT *
  FROM lv_hierarchy
#category_idparent_category_idnamelevelpath
11NULLТовары для дома1/Товары для дома
22NULLЦифровая техника1/Цифровая техника
331Бытовая техника2/Товары для дома/Бытовая техника
442Ноутбуки и аксессуары2/Цифровая техника/Ноутбуки и аксессуары
552Фотоаппараты2/Цифровая техника/Фотоаппараты
662Игровые консоли2/Цифровая техника/Игровые консоли
772Аудиотехника2/Цифровая техника/Аудиотехника
882Сотовые телефоны2/Цифровая техника/Сотовые телефоны
994Ноутбуки3/Цифровая техника/Ноутбуки и аксессуары/Ноутбуки
10104Рюкзаки3/Цифровая техника/Ноутбуки и аксессуары/Рюкзаки
ПредыдущаяСледующая