假设我有两个表: 第一个名为sales
,有两列名为product
和quantity
第二个名为nomenclature
并有两列名为compound
和component
。
每个compound
都可以有多个components
,每个component
本身都可以是具有多个components
的compound
,这使得第二个表成为层次结构。 让我们以下表为例:
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;