このディレクトリの索引

# 出典 :: SQL質疑応答スレ 10問目 #197 # ・DBMS名とバージョン # VB2008でOLEDBを使ってOracle10gに繋いでます。 # # ・テーブルデータ # どの部品にはどの部品が使われてて〜といううような、 # 部品の構成を表す、下記のような親子関係と必要数のテーブルがあります # ------------- # OYA KO KAZU # ------------- # A   B  1 # A   G  1 # B   C  1 # B   F  1 # C   D  1 # C   E  1 # G   C  2 # G   H  1 # # # ツリーで表記すると、 # A # ├B # │├C # ││├D # ││└E # │└F # └G #  ├C #  │├D #  │└E #  └H # # Aという部品は、BとGの部品で出来ている。 # Bという部品はCとFの部品で出来ている〜という感じです。 # # ・欲しい結果 # これを階層のレベルと、それぞれの子の合計数を出したい。 # ここでいうBの下のCは1なので、DもEも1だが、 # Gの下のCは2なので、DもEもx2されて2になる # ---------------- # LV KO  GOUKEI # ---------------- # 1  B   1 # 2  C   1 # 3  D   1 # 3  E   1 # 2  F   1 # 1  G   1 # 2  C   2 # 3  D   2 # 3  E   2 # 2  H   1 # # # 今は、プログラム側で親から子を見る所をサブルーチンで組み、回帰処理でループさせてるので、 # リクエストが多く、あまりにも酷いかなぁ。。。と。 # 色々サンプルを見てconect byとかよく似てるんで、何かやり方があるのかな?と思い質問してみました。 # # 部品('A','B',1). 部品('A','G',1). 部品('B','C',1). 部品('B','F',1). 部品('C','D',1). 部品('C','E',1). 部品('G','C',2). 部品('G','H',1). 必要な部品数(_階層,_親,1) :- \+(部品(_親,_,_)), writef('%w,%w,%w\n',[_階層,_親,1]),!. 必要な部品数(_階層,_親,_必要な部品数) :- freeze(_必要な部品数,writef('%w,%w,%w\n',[_階層,_親,_必要な部品数])), findall(_子供の部品数,( 部品(_親,_子,_個数), succ(_階層,_階層_2), 必要な部品数(_階層_2,_子,_子供の部品数_1), _子供の部品数 is _子供の部品数_1 * _個数),_部品数のならび), sum_list(_部品数のならび,_必要な部品数).