PostgreSQL:选择材料及其所有父类别

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

我有两张桌子

Categories
--Id
--Name
--ParentCategoryId (reference to Categories table column Id)

Materials
--Id
--Name
--CategoryId (reference to Categories table column Id)

我想选择指定的材料及其所有父类别

Categories table data
--Id Name                 ParentCategoryId
  1  food                 null
  2  fruits               1
  3  exotic fruits        2
  4  IT equipment         null


Materials table data
--Id Name             CategoryId
  1  mango            3

所以当我选择 Id=1 的芒果时,我想在我的结果集中获取该材料的所有相关类别(食物、水果、异国水果)

我通过使用递归子句写了这样的东西

WITH RECURSIVE RecursiveCTE  AS(
    SELECT m."Id", m."Name", c."Id" as "CategoryId", c."Name" "CategoryName"
    FROM "Materials" m
    INNER JOIN "Categories" c on c."Id" = m."CategoryId"
    where m."Id" = 1

    union all

    SELECT rt."Id", rt."Name", c."Id" as "CategoryId", c."Name" "CategoryName"
    FROM RecursiveCTE rt
    INNER JOIN "Categories" c on c."ParentCategoryId" = rt."Id"
)
SELECT * FROM RecursiveCTE
postgresql parent-child with-clause
1个回答
0
投票

已解决)))

WITH RECURSIVE RecursiveCTE  AS(
    SELECT m."Id", m."Name", c."Id" as "CategoryId", c."Name" as "CategoryName", c."ParentCategoryId"
    FROM "Materials" m
    INNER JOIN "Categories" c on c."Id" = m."CategoryId"
    where m."Id" = 1

    union all

    SELECT rt."Id", rt."Name", c."Id" as "CategoryId", c."Name" as "CategoryName", c."ParentCategoryId"
    FROM RecursiveCTE rt
    INNER JOIN "Categories" c on c."Id" = rt."ParentCategoryId"
    WHERE rt."ParentCategoryId" is not null
)
SELECT * FROM RecursiveCTE
© www.soinside.com 2019 - 2024. All rights reserved.