Доступ: как сделать запрос, пока не будет найден последний родитель? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть состав сборочных единиц, описанный в таблице 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 для достижения автоматизации c расчет плана изготовления дочерних узлов и деталей? Таким образом, я мог бы получить следующий результат:

+-------+----------+
| Child | Plan     |
+-------+----------+
|   111 |      123 |
|   112 |      492 |
|   113 |      123 |
|   211 |     1368 |
|   222 |     6840 |
|    21 |      456 |
|    22 |     1368 |
|    11 |      123 |
|    12 |      123 |
|    1  |      123 |
|    2  |      456 |
+-------+----------+

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Попробуйте

   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 

Те же данные были получены с иллюстрированными данными. Я не знаю, изменятся ли данные, но проверь это. Я тестировал в Excel sql.

изображение результата

enter image description here

0 голосов
/ 03 марта 2020

Я сделал это, используя синтаксис 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

Хитрая часть отделяла root родителей от остальных, но потом я нашел способ сделать это, сравнив значения Child и Parent

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...