1

我有两张桌子

零件

id    -    component_name     parent_id(self ref)
----------------------------------------
1      -   computer                 
2      -   cpu                   1
3      -   lcd
4      -   keyboard

子组件

id    -   name             ref_component
-------------------------------------
1     -  motherboard       2
2     -  ram               2
3     -  processor         2

现在,当我将计算机 ID 传递给原因时,我的期望输出应该遵循

computer
  -cpu
     -processor
     -motherboars
     -ram
  -lcd
  -keyboard
4

1 回答 1

1

如果您有无限级别的子组件,那么更好的方法是仅使用components表。由于它有一个自引用列,因此很容易将它与RECURSIVE 查询一起使用。

以下查询可以解决问题:

WITH RECURSIVE items AS (
   SELECT c.id, c.component_name, 1 AS level, array[c.component_name]::text[] AS path
   FROM component c
   WHERE c.parent_id IS NULL
   UNION ALL
   SELECT c.id, c.component_name, i.level + 1, array_append(i.path, c.component_name)
   FROM component c JOIN items i ON c.parent_id = i.id
)
SELECT repeat('|---', level-1) || component_name
FROM items
ORDER BY path;

repeat功能只是为了便于直接在数据库客户端、您可以使用的编程语言上查看levelid以及parent_id(甚至只是path)控制输出。

请参阅此示例的SQLFiddle

于 2013-10-22T18:50:59.260 回答