指定の品目(検索の祖先)を 交えた表示を達成したいのですが、
指定値が複数の場合の対処方法が分からずに困っています。
ご提示いただいた製品構成マスタ
テーブルのサンプルデータには
ルートノード( 検索指定列に表示されているA001
)を特定できるレコードが見当たらない...ですね。
そのため、ご希望の抽出方法を実装するためにはSQL
文において
「 親品目コードには存在するけれども、子品目コードには存在しない 」
という条件に合致した品目コード
をルートノード
として定義する必要があるでしょう。
以下のような感じでどうでしょうか。
( WITH句でのルートノード特定方法がとてつもなくダサいのはご容赦 )
SQL
1WITH saya24 ( parent, child, path, hierarchy, root ) AS
2(
3 SELECT parent
4 , child
5 , sys_connect_by_path( q.child, '/' )
6 , level
7 , case
8 when level = 1
9 then
10 substr( sys_connect_by_path( q.child, '/' ), 2 )
11 else
12 substr( sys_connect_by_path( q.child, '/' )
13 , 2
14 , instr( sys_connect_by_path( q.child, '/' ), '/', 1, 2 ) - 2
15 )
16 end
17 FROM
18 (
19 SELECT 子品目コード child, 親品目コード parent
20 FROM 製品構成マスタ
21
22 UNION ALL
23
24 SELECT 親品目コード, 'root'
25 FROM 製品構成マスタ
26 MINUS
27 SELECT 子品目コード, 'root'
28 FROM 製品構成マスタ
29 ) q
30 start with parent = 'root'
31 connect by prior child = parent
32)
33
34SELECT *
35 FROM saya24
36 WHERE root IN ( 'A001' )
37;
■結果
result
1parent child path hierarchy root
2------------------------------------------------------
3root A001 /A001 1 A001
4A001 B001 /A001/B001 2 A001
5B001 C002 /A001/B001/C002 3 A001
6C002 F002 /A001/B001/C002/F002 4 A001
7C002 F003 /A001/B001/C002/F003 4 A001
8C002 G001 /A001/B001/C002/G001 4 A001
9B001 C003 /A001/B001/C003 3 A001
10B001 D001 /A001/B001/D001 3 A001
11A001 B002 /A001/B002 2 A001
12B002 D002 /A001/B002/D002 3 A001
13B002 D003 /A001/B002/D003 3 A001
14B002 E001 /A001/B002/E001 3 A001
15A001 B101 /A001/B101 2 A001
16B101 C102 /A001/B101/C102 3 A001
17B101 C103 /A001/B101/C103 3 A001
18B101 D101 /A001/B101/D101 3 A001
19A001 B102 /A001/B102 2 A001
20A001 C001 /A001/C001 2 A001
21C001 E002 /A001/C001/E002 3 A001
22C001 E003 /A001/C001/E003 3 A001
23C001 F001 /A001/C001/F001 3 A001
24A001 C101 /A001/C101 2 A001