在 ORACLE 中查找符合特定标准的孩子



假设我有两个表: 第一个名为sales,有两列名为productquantity第二个名为nomenclature并有两列名为compoundcomponent

每个compound都可以有多个components,每个component本身都可以是具有多个componentscompound,这使得第二个表成为层次结构。 让我们以下表为例:

TABLE : SALES
PRODUCT  -  QUANTITY
P1       -  200
P2       -  300
F3       -  400
P5       -  500

TABLE : NOMENCLATURE
COMPOUND - COMPONENT
P1        - A1
P1        - B2
P2        - D4
A1        - F6
B2        - Q7
D4        - F8
Q7        - F9
F9        - H10
P3        - F11

我想找到SALES.PRODUCT层次结构中以 F 开头的每一行,并返回它们和/或如果产品本身以 F 开头则返回自身,否则忽略该行。最终结果应如下所示:

PRODUCT - QUANTITY - COMPONENT
P1      - 200      - F6
P1      - 200      - F9
P2      - 300      - F8
F3      - 400      - F3
F3      - 400      - F11

(P5 被忽略,因为它不以 F 开头,并且没有任何以 F 开头的子项)

如何以最有效的方式在PL/SQL(ORACLE)中获取此结果(命名法实际上有超过500k行)

你可以做这样的事情:

WITH combined ( product, component, quantity ) AS (
SELECT product, product, quantity FROM sales
UNION ALL
SELECT compound, component, NULL FROM nomenclature
)
SELECT CONNECT_BY_ROOT( product ) AS product,
CONNECT_BY_ROOT( quantity ) AS quantity,
component
FROM   combined
WHERE  component LIKE 'F%'
START WITH quantity IS NOT NULL
CONNECT BY NOCYCLE PRIOR component = product;

最新更新