使用带有自外键的递归

Using recursion with a self Foreign key

我使用的是 PostgreSQL 10,我有以下结构:

A table 带有自身外键的类型。

    id  name   parent_id
    1  namea    Null
    2  nameb    Null
    3  namea1   1
    4  namea11  3 
    5  namea111 4 
    6  nameb1   2 
    7  nameb2   2

A table Item_Type 多对多关系

   id type_id item_id
   1    1      1
   2    3      2
   3    5      3
   4    7      4

Table 与类型有 M2M 关系的项目。

 id   name 
  1  item1   
  2  item2   
  3  item3   
  4  item4   

目前,我正在使用一个额外的 path 字段,我每次使用 Type 进行操作(crud)时都会计算它。

我想知道是否可以更快更容易地尝试使用 PostgreSQL recursion

我看了文档,但不是很明白,因为我报错了,我也没有低估原因。

WITH RECURSIVE descendants AS (
 SELECT id, name FROM Type WHERE id = 1
 UNION
 SELECT t.id, t.name, t.parent_id FROM Type AS t
 INNER JOIN descendants AS d ON d.id = t.parent_id
) SELECT * FROM descendants;

ERROR: each UNION query must have the same number of columns

我需要什么 - 提供类型名称:

1) 获取请求的 Type 的所有 names/id 并且是后代

2) 获取请求的Type和后代的所有Item,以及每个Type和后代

Item个数

例如:

如果请求的类型名称是 'namea1',我应该获取类型 ID 1,3,4,5 和 对于项目 ID 1,2,3

错误说明了一切。您的工会分为:

  • SELECT <2 fields> from Type ...
  • SELECT <3 fields> from Type JOIN Descendant ...

只需 select 两半 3 个字段:

WITH RECURSIVE descendants AS (
 SELECT id, name, parent_id FROM Type WHERE id = 1
 UNION
 SELECT t.id, t.name, t.parent_id FROM Type AS t
 INNER JOIN descendants AS d ON d.id = t.parent_id
) SELECT * FROM descendants;