Postgresql查询输出格式

时间:2013-10-18 06:46:11

标签: sql postgresql

我有两张桌子

组件

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

1 个答案:

答案 0 :(得分:1)

如果你有无限级别的子组件,那么更好的方法是只使用components表。由于它有一个自引用列,因此使用RECURSIVE query非常容易。

以下查询将解决这个问题:

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函数只是为了让您可以直接在数据库客户端上查看使用levelidparent_id的编程语言(或者甚至只是path)来控制输出。

请参阅此示例中的 SQLFiddle