访问:如何查询直到找到最终父级?

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

以上是关于访问:如何查询直到找到最终父级?的主要内容,如果未能解决你的问题,请参考以下文章

通过子关系 ParseSwift 查询父级

php递归查询不会,,求教。就是一个三级分类传个ID找到他的上级,还有父级。。

树中路径上的范围查询

如何忽略层次结构查询中特定类型的直接父级

具有多个父级的 Oracle 分层查询

在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]