访问:如何查询直到找到最终父级?
Posted
技术标签:
【中文标题】访问:如何查询直到找到最终父级?【英文标题】:Access: how to query until final parent is found? 【发布时间】:2020-03-03 10:19:22 【问题描述】:我有一个在表 tblComposition 中描述的组装单元的组合,如下所示:
+-------+--------+----------+
| Child | Parent | Quantity |
+-------+--------+----------+
| 111 | 11 | 1 |
| 112 | 11 | 4 |
| 113 | 11 | 1 |
| 211 | 21 | 3 |
| 222 | 22 | 5 |
| 21 | 2 | 1 |
| 22 | 2 | 3 |
| 11 | 1 | 1 |
| 12 | 1 | 1 |
| 1 | 1 | 1 |
| 2 | 2 | 1 |
+-------+--------+----------+
也就是说,5个零件编号222组装在单元22中,然后3个单元22组装在产品2中。嵌套可以任意大。
如果我在 tblProducts 中定义了第二天的生产计划:
+---------+------+
| Product | Plan |
+---------+------+
| 1 | 123 |
| 2 | 456 |
+---------+------+
是否有任何 SQL 查询或 VBA 代码来自动计算制造子组件和零件的计划? 所以我可以得到以下结果:
+-------+----------+
| Child | Plan |
+-------+----------+
| 111 | 123 |
| 112 | 492 |
| 113 | 123 |
| 211 | 1368 |
| 222 | 6840 |
| 21 | 456 |
| 22 | 1368 |
| 11 | 123 |
| 12 | 123 |
| 1 | 123 |
| 2 | 456 |
+-------+----------+
【问题讨论】:
父级 1 是否以自己为父级的子级出现在表中? 112 也是 11 的孩子,但不受影响。您是否仅在数量为 1 时应用此nesting
?请将您的所有条件添加到您的问题中并使用统一的术语。
@HarassedDad,是的,为什么我不编辑初始和结果表
@krishKM,我不确定,你是什么意思。112 是 11 岁的孩子,计划 492 = 123(11 人的计划)* 4 件(每件产品)。跨度>
@Triostrong 。 . . MS Access 不支持递归或分层查询。您需要使用应用程序代码来执行此操作,大概是 VBA。
【参考方案1】:
我使用 Postgres 语法完成了它,因为我没有 Access 并且我不知道确切的语法。
WITH RECURSIVE composition(Child,Parent,Quantity) AS (
SELECT tbc.Child,tbc.Parent,tp.Plan
FROM tblComposition tbc, tblProducts tp
WHERE tbc.Parent = tp.Product and tbc.child = tbc.parent
UNION ALL
SELECT tc.Child,tc.Parent,tc.Quantity * c.Quantity
FROM composition c, tblComposition tc
WHERE c.Child = tc.Parent and tc.child <> tc.parent
)
SELECT * FROM composition
这是小提琴:http://sqlfiddle.com/#!17/00f6b/15
棘手的部分是将根父母与其他人分开,但后来我找到了方法,通过比较子值和父值
【讨论】:
我得到了答案,但赞成票?这与 MS Access 无关。 @GordonLinoff,我没有将此标记为答案。在 Access 查询中似乎无法实现。我只需要一些有关如何搜索问题的信息。看起来this和我的问题很相似,可以通过VBA解决。 @Triostrong 。 . .我添加了评论以阻止人们编写在可用标签中明显失败的答案。这就像为 C++ 问题编写 Java 答案。【参考方案2】:试试
SELECT chd as Child,(qty * [d.plan]) as Plan from
(select a.child as chd, a.parent, a.Quantity as qty, b.parent as id from [tblComposition] as a left join [tblComposition] as b on a.Parent = b.child ) as c
left join [tblProducts] as d on c.id = d.product
用图示数据获得了相同的数据。我不知道数据是否会改变,但测试一下。我用sql在excel中测试过。
结果图片
【讨论】:
我在 Access 中得到了相同的结果,但请查看 222 的计划。应该是 6840 = 5*3*456,但查询返回 2280 = 5*456以上是关于访问:如何查询直到找到最终父级?的主要内容,如果未能解决你的问题,请参考以下文章