このディレクトリの索引
http://pc11.2ch.net/test/read.cgi/db/1252492296/839
#  Table1 
#  |ID|Score|Div1|Div2| 
#  |1 |0.2  |1   |1   | 
#  |2 |0.3  |1   |2   | 
#  |3 |0.4  |1   |3   | 
#  |4 |0.2  |1   |4   | 
#  |5 |0.1  |2   |1   | 
#  |6 |0.3  |2   |3   | 
#   
#  Table2 
#  |ID|Div1| 
#  |1 |1   | 
#  |1 |2   | 
#  |1 |3   | 
#  |2 |2   | 
#   
#   
#  こういう構成で、約2000万行のTable1と約100万行のTable2について 
#  1.Select Div1, Score From Table Where Div2 = 2 or Div2 = 4; 
#  2.Select Div1, Score From Table Where Div2 = 5 or ... or Div2 = 9; 
#   : 
#   : 
#  N.・・・・; 
#  このようなN個のクエリを発行し、 
#  得られる全ての結果から共通するDiv1の値を含む行のみを抽出、 
#  得られた共通するDiv1の値を使ってTable2にjoinし、 
#  Table2のIDごとのScoreの合計値を取得したいのです。 
#  (Score値が複数回加算されるのは仕様です) 
#   
#  手続き的に処理をしているのですが、どうにも遅く 
#  一回のSQLで素早く取得する方法はありませんでしょうか。 
#   
#  どうかお願い致します。 
# 

'ルール1~N全てに解が存在するID'(_Div2,_ルールならび,X) :-
        'ルール1~N全てに解が存在するID'(0,_Div2,_ルールならび,X),
        abolish('_Div1_temp'/2).

'ルール1~N全てに解が存在するID'(N,_,[],X) :-
        findall(_Div,'_Div1_temp(_Div,N),X).
'ルール1~N全てに解が存在するID'(N,_Div2,[_ルール|R],X) :-
        'ルール1~N全てにとして存在するID'(N,_Div2,_ルール).
'ルール1~N全てに解が存在するID'(N,_Div2,[_ルール|R],X) :-
        N2 is N + 1,
        'ルール1~N全てに解が存在するID'(N,_Div2,R,X).

'ルール1~N全てに解として存在するID'(0,_Div2,_ルール) :-
        'Table1'(_ID,_Score,_Div1,_Div2),
        call(_ルール),
        \+('_Div1_temp'(_Div1,1)),
        assertz('_Div1_temp'(_Div1,1)),
        fail.
'ルール1~N全てに解として存在するID'(N,_Div2,_ルール) :-
        N > 0,
        'Table1'(_ID,_Score,_Div1,_Div2),
        call(_ルール),
        '_Div1_temp'(_Div1,N),
        N2 is N + 1,
        retract('_Div1_temp'(_Div1,N)),
        assertz('_Div1_temp'(_Div1,N2)),
        fail.