階層検索

テーブルのイメージ

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

SQL

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


「親は子を知っている」パターンでも、適用できそうだ