トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-119 経路の総積を取得

SQLパズル

部品表テーブル
OYABUN  KOBUN   SUU
------  ------  ---
001000  002000    1
001000  003000    2
002000  002100    1
002000  002200    1
003000  003100    2

各レコードの、
始祖までの経路の総積を取得する。
ただし、SUUは正数のみとする。

OYABUN  KOBUN   SUU
------  ------  ---
001000  002000    1
001000  003000    2
002000  002100    1   ←1*2
002000  002200    1   ←1*1
003000  003100    4   ←2*2


データ作成スクリプト

create table 部品表 as
select '001000' as OYABUN,'002000' as KOBUN,1 as SUU from dual
union select '001000','003000',2 from dual
union select '002000','002100',1 from dual
union select '002000','002200',1 from dual
union select '003000','003100',2 from dual;


SQL

--■■■相関サブクエリを使う方法■■■
select oyabun,kobun,
(select round(exp(sum(Ln(b.suu)))) from 部品表 b
 Start With b.RowID = a.RowID
 connect by prior b.oyabun = b.kobun) as suu
 from 部品表 a;

--■■■インラインビューとグループ化を組み合わせる方法■■■
select OYABUN,KOBUN,round(exp(sum(Ln(suu)))) as SUU
from (select connect_by_root OYABUN as OYABUN,
      connect_by_root KOBUN as KOBUN,
      suu
      from 部品表
      connect by prior oyabun = kobun)
group by OYABUN,KOBUN
order by OYABUN,KOBUN;


解説

対数を使って、
掛け算を、足し算に変形してます。

2-3-16 総積を求める