【发布时间】:2015-02-26 04:31:00
【问题描述】:
我有两个表,定义如下:
CREATE TABLE Parts (
id INTEGER PRIMARY KEY,
Name TEXT,
Quantity INTEGER,
Parentid INTEGER
);
CREATE TABLE Weight(
Name TEXT,
Weight INTEGER
);
部件表包含父部件和子部件的行。
对于产品 A,有几个部分(B1 和 B2)和子部分(C1-C4):
内容类似于:
答:2xB1、2xB2、1xC1、5xC2
B1:3xC1、2xC2
B2:1xB1,1xC3
重量如下:
C1:5
C2:4
C3:2
...或:
╔════════════════════════════════════╗
║ Parts ║
╠═══════╦══════╦══════════╦══════════╣
║ id ║ Name ║ Quantity ║ Parentid ║
╠═══════╬══════╬══════════╬══════════╣
║ A ║ A ║ 1 ║ NULL ║
║ B1 ║ B1 ║ 2 ║ A ║
║ B2 ║ B2 ║ 2 ║ A ║
║ C1 ║ C1 ║ 1 ║ A ║
║ C2 ║ C2 ║ 5 ║ A ║
║ C1 ║ C1 ║ 3 ║ B1 ║
║ C2 ║ C2 ║ 2 ║ B1 ║
║ B1 ║ B1 ║ 1 ║ B2 ║
║ C3 ║ C3 ║ 1 ║ B2 ║
╚═══════╩══════╩══════════╩══════════╝
╔═════════════════╗
║ Weight ║
╠════════╦════════╣
║ Name ║ Weight ║
╠════════╬════════╣
║ C1 ║ 5 ║
║ C2 ║ 4 ║
║ C3 ║ 2 ║
║ C4 ║ 8 ║
╚════════╩════════╝
表格中是子零件 C1-C4 的重量和每个零件的数量。 如何获得每个零件和整个产品的重量?
我知道这是递归 CTE,但我无法得到我想要的结果。 我在Recursive sum in tree structure 的帮助下进行了尝试,但没有取得多大成功。
这就是我所拥有的:
WITH c as (
SELECT Parts.id,
Parts.quantity,
Parts.id as RootID,
(Parts.quantity * Weight.weight) as Weight
FROM Parts LEFT JOIN Weight ON Weight.name = Parts.name
UNION ALL
SELECT Parts.id,
Parts.quantity,
c.RootID,
(Parts.quantity * Weight.weight) as Weight
FROM Parts LEFT JOIN Weight on Weight.name = Parts.name
INNER JOIN c on Parts.Parentid = c.id
)
SELECT Parts.id,
Parts.parent,
Parts.name,
Parts.quantity,
S.SumWeight
FROM Parts INNER JOIN (
SELECT rootid,
SUM(weight) as SumWeight
FROM c
GROUP BY rootid
) as S on Parts.id = S.rootid
ORDER BY Parts.id
我想要达到的结果是这样的:
121
B1 23
B2 25
感谢任何帮助!
【问题讨论】:
-
23 等于 B1 或 121 等于 A?数量?你怎么想出来的?
-
如果要加入名称列,请考虑使用 varchar 而不是文本。更好的是,如果可能的话,考虑加入整数以提高性能。
-
B1 = 3xC1 (=3*5) + 2xC2 (=2*4) = 15+8 = 23,重量乘以数量。是的。性能对我来说不是问题,我只是个初学者。
-
您使用的是哪个 DBMS? Postgres?