SQL:使用另一个表中的匹配祖先进行联接(内部联接)

问题描述 投票:1回答:2

所以我完全无法解决这个SQL查询。

我有一个树状结构中的产品类别表。为简化起见,假设有3个顶级类别:A,B,C。在它们上方还有一个类别(“全部”)是根类别。无法将任何产品分配给该类别。为了区分无法分配给产品的类别,它们的类型为“摘要”,而不是“具体”]

每个类别可以具有任意数量和深度的子类别。我当前正在使用父ID将这些ID存储到直接父(邻接列表)。

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

我还有另一个带有类别字段的产品表。该表中出现的唯一类别是顶级类别。即。 A,B或C。

Products

Part Number       Category
XXXX-XXXX         A
XXXX-YYYY         A
XXXX-ZZZZ         B
YYYY-XXXX         C

我想创建一个将两个表连接起来的查询,以创建将类别替换为子类别的行。即。从伪代码的角度来看,基本上可以加入category =,前提是category等于或等于category的后代。

所以类似:

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 ltree,但是我不太熟悉。

有什么想法吗?

所以我完全无法解决这个SQL查询。我有一个树状结构中存在的产品类别表。为简单起见,假设有3个顶级类别:A,B,C。...

sql postgresql common-table-expression hierarchy
2个回答
0
投票

我想你想要这样的东西:


0
投票

所以我相信这是可行的:

© www.soinside.com 2019 - 2024. All rights reserved.