階層検索
テーブルのイメージ
CREATE TABLE OYAKO1 ( KEY1 VARCHAR2(100), ME VARCHAR2(100), KO VARCHAR2(100) )
こんなデータ入れた
KEY1 | ME | KO |
---|---|---|
a | 10 | 20 |
a | 10 | 30 |
m11 | 20 | |
m12 | 30 | |
a | 40 | 50 |
m21 | 50 | |
a | 60 | 20 |
select level -- rootからのレベル , key1 -- 目印 ,me ,ko ,sys_connect_by_path(to_char(ME),'->') as Path --rootからのパス ,connect_by_root me as rootID --rootレコードの meを表示 ,prior me as oya --自分の親を表意 from OYAKO1 start with key1='a' -- key1がaのものを rootと定義した connect by prior ko = me -- 左辺と右辺を入れ替えると意味が変わるので注意。rootのkoに同じmeを持つものを接続する
LEVEL | KEY1 | ME | KO | PATH | ROOTID | OYA |
---|---|---|---|---|---|---|
1 | a | 10 | 20 | ->10 | 10 | |
2 | m11 | 20 | ->10->20 | 10 | 10 | |
1 | a | 10 | 30 | ->10 | 10 | |
2 | m12 | 30 | ->10->30 | 10 | 10 | |
1 | a | 40 | 50 | ->40 | 40 | |
2 | m21 | 50 | ->40->50 | 40 | 40 | |
1 | a | 60 | 20 | ->60 | 60 | |
2 | m11 | 20 | ->60->20 | 60 | 60 | |
1 | a | 70 | 20 | ->70 | 70 | |
2 | m11 | 20 | ->70->20 | 70 | 70 |
「親は子を知っている」パターンでも、適用できそうだ