Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql查询输出格式_Sql_Postgresql - Fatal编程技术网

Postgresql查询输出格式

Postgresql查询输出格式,sql,postgresql,Sql,Postgresql,我有两张桌子 组件 id - component_name parent_id(self ref) ---------------------------------------- 1 - computer 2 - cpu 1 3 - lcd 4 - keyboard 子组件 id - name ref_compon

我有两张桌子

组件

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

如果您有无限级别的子组件,那么更好的方法是只使用
组件
表。由于它有一个自引用列,因此可以很容易地将其与

以下查询将完成此操作:

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
函数只是为了使直接在数据库客户机上查看变得容易,在编程语言上,您可以使用
级别
id
父id
(甚至只是
路径
)来控制输出


请参见本例中的

如果子组件的级别无限,则更好的方法是仅使用
组件表。由于它有一个自引用列,因此可以很容易地将其与

以下查询将完成此操作:

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
函数只是为了使直接在数据库客户机上查看变得容易,在编程语言上,您可以使用
级别
id
父id
(甚至只是
路径
)来控制输出


请参见本例中的

开头带有空格?您如何知道cpu是“计算机”的“子代”?
组件
表中没有父/子信息。其空格表示意图。如果可能的话,@ShyamSolanki-你有多少等级?ie-您需要某种树组装查询吗?否则,您只需重新提交您先前的问题。请注意,与潜在副本一样,实际格式应该留给实际显示输出的程序。也。。。为什么有一个单独的
子组件
表?级别不固定。。高达n级..开头有空格?你怎么知道cpu是“计算机”的“子”呢?
组件
表中没有父/子信息。其空格表示意图。如果可能的话,@ShyamSolanki-你有多少等级?ie-您需要某种树组装查询吗?否则,您只需重新提交您先前的问题。请注意,与潜在副本一样,实际格式应该留给实际显示输出的程序。也。。。为什么有一个单独的
子组件
表?级别不固定。。高达n级。。