mysql - 我可以在 sql 中使用递归来完成这个查询吗?
问题描述
我有一个主表和一个子表。主表是部件的主列表,子表是构建它所需的集合部件。每个子部件都通过 ParentID 链接到它的父部件。
零件或“孩子”有一个 ChildID,它指向它自己在主要零件列表中的条目。我们使用这个链接来获取它的价格,因为在子表中,只存储了 ID。
很多时候,只有标记为 sub 的零件才会存储其价格。下面的这个查询用于汇总任何条目的成本,总计其子项目列表中所有价格的总和。
我想做的是,如果子部分是 PartType = master,那么我想使用相同的查询汇总它的成本,并将其用作价格。
我知道这是一个非常复杂的问题,这可能吗?
Select *, ifnull(
(SELECT SUM(main.PricePer * Qty)
FROM sub inner join main on sub.ChildID = main.ID
where sub.ParentID = main1.PID),
0)
from main as main1
例子:
我们有
主表第 1 部分和第 4 部分作为主要部分。第 1 部分准确地汇总了它的总成本,因为它的所有子部件都是指定的子部件。但第 4 部分将第 1 部分作为子部分。这意味着它对 PricePer 的引用是不准确的。它应该在对第 1 部分进行总计时使用 TotalCost,但要做到这一点,我需要以某种方式将使用的查询 part1 嵌套在第 4 部分的查询中。
ID | Name | TotalCost | PricePer | PartType
1 Part1 10.00 0.00 master
2 Part2 0.00 6.00 sub
3 Part3 0.00 2.00 sub
4 Part4 4.00 0.00 master //should be 14.00
第 1 部分的子表
ParentID | ChildID | Name | Qty
1 2 Part2 1
1 3 Part3 2
第 4 部分的子表
ParentID | ChildID | Name | Qty
4 1 Part1 1
4 3 Part3 2
解决方案
推荐阅读
- powershell - 将类中对象的事件处理程序连接到同一类中的方法
- typescript - 这个 TypeScript 函数参数是如何工作的
- javascript - 使用 JS 如何检测我悬停的颜色?
- c++ - 使用 For 循环制作位图的最简单和最有效的方法
- scala - Scala:使用 PureConfig 创建通用实用程序
- awk - 使用 awk 命令透视表内容
- php - 客户端未授权使用此方法检索访问令牌,或者客户端未授权任何请求的范围
- polymer-2.x - Polymer 2.0 将 id 动态分配给
- 在 dom-repeat 模板中使用 this.shadowRoot.querySelector() 在数组上的观察方法中返回 null
- javafx - FXML 文件加载但不显示在场景中
- android - 如何防止在 Fragment 不可见时激活 LiveData 观察者