Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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
获取零件所有组件的递归SQL查询_Sql_Postgresql_Recursion - Fatal编程技术网

获取零件所有组件的递归SQL查询

获取零件所有组件的递归SQL查询,sql,postgresql,recursion,Sql,Postgresql,Recursion,给定如下所示的两个表Part和Structure,我想编写一个SQL查询,返回一个列表,其中包含组成引擎的所有部件的描述以及每个部件的数量 这需要是一个递归语句,不是吗?我想,它也需要和。发动机由外壳和螺钉组成,但外壳本身也由螺钉组成。因此,查询结果应为: 描述 量 套管 1. 螺丝钉 10 (= 2 + 8) 关系 1. 只有当某些组件本身具有进一步的结构时,才需要递归。您的数据只嵌套了一个额外的级别,您可以通过自联接和/或联合来处理该级别。如果您有任何进一步的组件嵌套,这种方法开始变得非常复

给定如下所示的两个表
Part
Structure
,我想编写一个SQL查询,返回一个列表,其中包含组成引擎的所有部件的描述以及每个部件的数量

这需要是一个递归语句,不是吗?我想,它也需要
。发动机由外壳和螺钉组成,但外壳本身也由螺钉组成。因此,查询结果应为:

描述 量 套管 1. 螺丝钉 10 (= 2 + 8) 关系 1.
只有当某些组件本身具有进一步的结构时,才需要递归。您的数据只嵌套了一个额外的级别,您可以通过自联接和/或联合来处理该级别。如果您有任何进一步的组件嵌套,这种方法开始变得非常复杂。我下面的代码使用递归CTE处理这个问题

WITH RECURSIVE cte AS
(
SELECT
    s.component_no,
    p.description,
    s.quantity
FROM
    part p
    JOIN structure s ON 
        p.part_no = s.component_no
WHERE 
    s.part_no = 1 --the part number of what you are making goes here.

UNION ALL

SELECT
    s.component_no,
    p.description,
    s.quantity
FROM
    part p
    JOIN structure s ON 
       p.part_no = s.component_no
    JOIN cte ON 
       cte.component_no = s.part_no
)

SELECT 
   cte.description,
   SUM(cte.quantity) as quantity
FROM
   cte
GROUP BY
   cte.description

您可以在

欢迎使用StackOverflow来运行此代码。可用的解决方案将根据所使用的DBMS而有所不同。请标记您正在使用的一个(例如MySQL、SQL Server)。我可以问一下为什么
轴承
没有出现在您的预期结果中吗?您是对的,我在预期结果中添加了
轴承
。多谢各位@狐猴。用你正在使用的数据库标记你的问题。首先,非常感谢你的回答!“只有当某些组件本身具有进一步的结构时,才需要递归。在示例数据中,情况似乎并非如此。”。由于发动机由外壳组成,外壳本身由螺钉组成,即使在这个小例子中也是如此,不是吗?或者我这里有什么地方出错了吗?是否可以不用递归(使用给定的数据)来完成?我可以更好地表达它。是的,递归确实在这里做了一些事情,但是在这种情况下,它也可以通过一个自连接来处理,即在同一个查询中引入结构表两次。我通常在第三次引入一个表时划定界限,并通过递归处理它。但是我想得越多,也许这种方式更好,即使是在简单的情况下。我会调整我的措辞。好的,这澄清了问题!