代码之家  ›  专栏  ›  技术社区  ›  user3541631

使用带有自外键的递归

  •  0
  • user3541631  · 技术社区  · 5 年前

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

    一种表类型,其本身带有一个外键。

        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
    
    <表格> Item_Type 对于多对多关系

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

    与类型具有M2M关系的表项。

     id   name 
      1  item1   
      2  item2   
      3  item3   
      4  item4   
    

    现在,我正在使用一个附加的 path 字段,每次使用类型进行操作(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;
    
    < Buff行情>

    错误:每个联合查询的列数必须相同

    < /块引用>

    我需要的-给出一个类型名:

    1)获取请求的所有名称/ID Type 是后代

    2)全部得到 Item 对于请求的 类型 和is后代,以及 项目的编号 per 类型 和后代

    例如:

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

    1 回复  |  直到 5 年前
        1
  •  2
  •   FXD    5 年前

    错误说明一切。你的工会被划分为:

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

    只需选择两半上的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;