Так что я совершенно тупик, пытаясь выяснить этот запрос SQL.
У меня есть таблица категорий товаров, которые существуют в древовидной структуре. Для упрощения скажем, есть 3 категории высшего уровня: A, B, C. Над ними есть еще одна категория («Все») - root. Никакие продукты не могут быть отнесены к этой категории. Чтобы различать категории guish, которые нельзя назначить продуктам, они имеют тип «Абстрактный», а не «Конкретный»
Каждая категория может иметь любое количество и глубину подкатегорий. , В настоящее время я храню их с идентификатором родителя для непосредственного родителя (список смежности).
Categories
Category Parent Type
All None Abstract
A All Concrete
B All Concrete
C All Concrete
D A Concrete
E D Concrete
F B Concrete
G F Concrete
H C Concrete
I C Concrete
У меня есть еще одна таблица продуктов с полем категории. В этой таблице отображаются только категории верхнего уровня. ie. Либо A, B, либо C.
Products
Part Number Category
XXXX-XXXX A
XXXX-YYYY A
XXXX-ZZZZ B
YYYY-XXXX C
Я хотел бы создать запрос, объединяющий две таблицы, чтобы создать строки, в которых категория заменяется дочерней категорией. ie. С точки зрения псевдокода в основном присоединение к категории = при условии, что категория либо равна, либо является потомком категории.
Так что-то вроде:
select * from products
inner join categories
on products.category = descendent of category
приведет к:
Part Number Category
XXXX-XXXX E (E's top level concrete parent is A)
XXXX-YYYY E (E's top level concrete parent is A)
YYYY-XXXX H (H's top level concrete parent is C)
YYYY-XXXX I (I's top level concrete parent is C)
У меня есть это, которое извлекает все конкретные типы до верхнего уровня:
with recursive
concrete_parents as (
select category, parent, type
from categories
where category in ('E', 'H', 'I')
UNION ALL
select t2.category, t2.parent, t2.type
from categories as t2
inner join concrete_parents t1
on t1.parent = t2.category
where t2.type = 'Concrete'
)
select distinct * from concrete_parents
order by parent;
Я не могу понять, как совместить это с внутренним соединением на главном столе?
Другая альтернатива, которую я рассматриваю, - это использование Postgres дерева, но я не очень знаком с ним.
Есть мысли?