0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【KPI】家系図テーブルの操作 1【oracle】

Posted at

某炎の紋章の家系図見てて、TRPGなどに使えるかなと思って家系図テーブルの運用を考える。
階層問い合わせを利用し、人の一覧である「M_人」テーブルと、子とその親を載せた「T_家」テーブルがある前提で、大雑把にデータを取得する方法を考える。

※WITH区で疑似テーブルとして作成

oracle
WITH M_人 AS
(
    SELECT '01' AS NO, '人01' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '02' AS NO, '人02' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '03' AS NO, '人03' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '04' AS NO, '人04' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '05' AS NO, '人05' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '06' AS NO, '人06' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '07' AS NO, '人07' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '08' AS NO, '人08' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '09' AS NO, '人09' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '10' AS NO, '人10' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '11' AS NO, '人11' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '12' AS NO, '人12' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '13' AS NO, '人13' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '14' AS NO, '人14' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '15' AS NO, '人15' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '16' AS NO, '人16' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '17' AS NO, '人17' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '18' AS NO, '人18' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '19' AS NO, '人19' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '20' AS NO, '人20' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '21' AS NO, '人21' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL UNION ALL
    SELECT '22' AS NO, '人22' AS 名, DATE '1900-01-01' AS 生年月日 FROM DUAL
)
, T_家 AS
(
    SELECT '03' AS NO, '01' AS 父, '02' AS 母 FROM DUAL UNION ALL
    SELECT '04' AS NO, '01' AS 父, '02' AS 母 FROM DUAL UNION ALL
    SELECT '05' AS NO, '01' AS 父, '02' AS 母 FROM DUAL UNION ALL
    SELECT '08' AS NO, '06' AS 父, '07' AS 母 FROM DUAL UNION ALL
    SELECT '09' AS NO, '06' AS 父, '07' AS 母 FROM DUAL UNION ALL
    SELECT '12' AS NO, '11' AS 父, '10' AS 母 FROM DUAL UNION ALL
    SELECT '13' AS NO, '11' AS 父, '10' AS 母 FROM DUAL UNION ALL
    SELECT '14' AS NO, '03' AS 父, '12' AS 母 FROM DUAL UNION ALL
    SELECT '15' AS NO, '03' AS 父, '12' AS 母 FROM DUAL UNION ALL
    SELECT '16' AS NO, '09' AS 父, '05' AS 母 FROM DUAL UNION ALL
    SELECT '17' AS NO, '09' AS 父, '05' AS 母 FROM DUAL UNION ALL
    SELECT '18' AS NO, '14' AS 父, '16' AS 母 FROM DUAL
)
SELECT  LEVEL AS レベル
    , SYS_CONNECT_BY_PATH(MAIN.NO, ',') AS 根_子
    , SYS_CONNECT_BY_PATH(MAIN.父, ',') AS 根_父
    , SYS_CONNECT_BY_PATH(MAIN.母, ',') AS 根_母
    , MAIN.NO AS 子
    , MAIN.父
    , MAIN.母
FROM T_家 MAIN
--START WITH (MAIN.NO) IN (SELECT NO FROM T_家)  -- ツリーのルート用件番号
CONNECT BY PRIOR MAIN.父 = MAIN.NO OR PRIOR MAIN.母 = MAIN.NO
ORDER BY MAIN.NO, MAIN.父, LEVEL

実行結果は下記となる。

レベル 根_子 根_父 根_母
1 ,03 ,01 ,02 03 01 02
2 ,15,03 ,03,01 ,12,02 03 01 02
2 ,14,03 ,03,01 ,12,02 03 01 02
3 ,18,14,03 ,14,03,01 ,16,12,02 03 01 02
1 ,04 ,01 ,02 04 01 02
1 ,05 ,01 ,02 05 01 02
2 ,17,05 ,09,01 ,05,02 05 01 02
2 ,16,05 ,09,01 ,05,02 05 01 02
3 ,18,16,05 ,14,09,01 ,16,05,02 05 01 02
1 ,08 ,06 ,07 08 06 07
1 ,09 ,06 ,07 09 06 07
2 ,17,09 ,09,06 ,05,07 09 06 07
2 ,16,09 ,09,06 ,05,07 09 06 07
3 ,18,16,09 ,14,09,06 ,16,05,07 09 06 07
1 ,12 ,11 ,10 12 11 10
2 ,15,12 ,03,11 ,12,10 12 11 10
2 ,14,12 ,03,11 ,12,10 12 11 10
3 ,18,14,12 ,14,03,11 ,16,12,10 12 11 10
1 ,13 ,11 ,10 13 11 10
1 ,14 ,03 ,12 14 03 12
2 ,18,14 ,14,03 ,16,12 14 03 12
1 ,15 ,03 ,12 15 03 12
1 ,16 ,09 ,05 16 09 05
2 ,18,16 ,14,09 ,16,05 16 09 05
1 ,17 ,09 ,05 17 09 05
1 ,18 ,14 ,16 18 14 16

項目「レベル」は世代の数-1(連続するデータの数)となる。レベル2は親-子-孫の3世代いる。
「根_子」「根_父」「根_母」はそれぞれ、世代ごとの子、父、母となるコードが出力される。

これらを使用して、次はデータ操作を行う画面を作成したい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?