使用分层查询和过滤器仅获取叶节点。
Oracle 设置:
CREATE TABLE table_name ( bom_code, rm_code, qty ) AS
SELECT 'A', 'B', 1 FROM DUAL UNION ALL
SELECT 'A', 'C', 2 FROM DUAL UNION ALL
SELECT 'A', 'D', 5 FROM DUAL UNION ALL
SELECT 'A', 'E', 3 FROM DUAL UNION ALL
SELECT 'A', 'F', 8 FROM DUAL UNION ALL
SELECT 'D', 'G', 2 FROM DUAL UNION ALL
SELECT 'D', 'H', 1 FROM DUAL UNION ALL
SELECT 'D', 'I', 1 FROM DUAL UNION ALL
SELECT 'D', 'J', 1 FROM DUAL UNION ALL
SELECT 'F', 'K', 1 FROM DUAL UNION ALL
SELECT 'F', 'L', 1 FROM DUAL UNION ALL
SELECT 'G', 'Z', 1 FROM DUAL UNION ALL
SELECT 'G', 'AA', 3 FROM DUAL UNION ALL
SELECT 'I', 'M', 4 FROM DUAL UNION ALL
SELECT 'I', 'N', 9 FROM DUAL UNION ALL
SELECT 'I', 'O', 7 FROM DUAL UNION ALL
SELECT 'N', 'P', 6 FROM DUAL UNION ALL
SELECT 'N', 'Q', 12 FROM DUAL UNION ALL
SELECT 'N', 'R', 4 FROM DUAL UNION ALL
SELECT 'N', 'S', 9 FROM DUAL UNION ALL
SELECT 'S', 'T', 3 FROM DUAL UNION ALL
SELECT 'S', 'U', 2 FROM DUAL UNION ALL
SELECT 'T', 'V', 1 FROM DUAL UNION ALL
SELECT 'T', 'W', 3 FROM DUAL UNION ALL
SELECT 'U', 'X', 5 FROM DUAL UNION ALL
SELECT 'U', 'Y', 8 FROM DUAL;
查询:
SELECT t.*,
SYS_CONNECT_BY_PATH( BOM_CODE, '-' ) || '-' || RM_CODE AS path,
LEVEL
FROM table_name t
WHERE CONNECT_BY_ISLEAF = 1
START WITH bom_code = 'A'
CONNECT BY PRIOR rm_code = bom_code;
输出:
BOM_CODE | RM_CODE |数量 |路径 |等级
:------- | :-------- | --: | :------------- | ----:
一个 |乙| 1 | -A-B | 1
一个 | C | 2 | -A-C | 1
克|机管局 | 3 | -A-D-G-AA | 3
克| Z | 1 | -A-D-G-Z | 3
D | H | 1 | -A-D-H | 2
我 |中号 | 4 | -A-D-I-M | 3
N |磷 | 6 | -A-D-I-N-P | 4
N |问 | 12 | -A-D-I-N-Q | 4
N |右 | 4 | -A-D-I-N-R | 4
T |五 | 1 | -A-D-I-N-S-T-V | 6
T | W | 3 | -A-D-I-N-S-T-W | 6
你 | X | 5 | -A-D-I-N-S-U-X | 6
你 |是 | 8 | -A-D-I-N-S-U-Y | 6
我 | ○ | 7 | -A-D-I-O | 3
D | Ĵ | 1 | -A-D-J | 2
一个 | E | 3 | -A-E | 1
F | ķ | 1 | -A-F-K | 2
F |大号 | 1 | -A-F-L | 2
查询 2:
如果您想要沿路径的总数,则使用相关子查询以反向遍历层次结构:
SELECT t.*,
SYS_CONNECT_BY_PATH( BOM_CODE, '-' ) || '-' || RM_CODE AS path,
LEVEL,
( SELECT SUM( qty )
FROM table_name s
START WITH t.rm_code = s.rm_code
CONNECT BY PRIOR bom_code = rm_code ) AS total_qty
FROM table_name t
WHERE CONNECT_BY_ISLEAF = 1
START WITH bom_code = 'A'
CONNECT BY PRIOR rm_code = bom_code;
输出:
BOM_CODE | RM_CODE |数量 |路径 |水平 | TOTAL_QTY
:------- | :-------- | --: | :------------- | ----: | --------:
一个 |乙| 1 | -A-B | 1 | 1
一个 | C | 2 | -A-C | 1 | 2
克|机管局 | 3 | -A-D-G-AA | 3 | 10
克| Z | 1 | -A-D-G-Z | 3 | 8
D | H | 1 | -A-D-H | 2 | 6
我 |中号 | 4 | -A-D-I-M | 3 | 10
N |磷 | 6 | -A-D-I-N-P | 4 | 21
N |问 | 12 | -A-D-I-N-Q | 4 | 27
N |右 | 4 | -A-D-I-N-R | 4 | 19
T |五 | 1 | -A-D-I-N-S-T-V | 6 | 28
T | W | 3 | -A-D-I-N-S-T-W | 6 | 30
你 | X | 5 | -A-D-I-N-S-U-X | 6 | 31
你 |是 | 8 | -A-D-I-N-S-U-Y | 6 | 34
我 | ○ | 7 | -A-D-I-O | 3 | 13
D | Ĵ | 1 | -A-D-J | 2 | 6
一个 | E | 3 | -A-E | 1 | 3
F | ķ | 1 | -A-F-K | 2 | 9
F |大号 | 1 | -A-F-L | 2 | 9
db小提琴here