我有两张桌子
组件
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
答案 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
函数只是为了让您可以直接在数据库客户端上查看使用level
,id
和parent_id
的编程语言(或者甚至只是path
)来控制输出。
请参阅此示例中的 SQLFiddle 。