このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1299305530/97
#  select * from table1 where col1 in (select colx, coly from table2); 
#   
#  的な書き方は無い? 
#  ↓ってするしかない? 
#   
#  select * from table1 where col1 in (select colx from table2) or col1 in (select coly from table2) ; 
# 
# 

'select * from table1 where col1 in (select colx from table2) or col1 in (select coly from table2)'(L1) :-
        テーブルの選択(table1,[col1],[_col1],L1,P1),
        テーブルの選択(table2,[colx,coly],[_colx,_coly],L2,P2),
        P1,
        P2,
        選択条件(_col1,_colx,_coly).

選択条件(X,X,_) :- !.
選択条件(X,_,X) :- !.


%%% テーブルが生成される時に定義される %%%

テーブル構造(table1,1,col1).
テーブル構造(table2,1,colx).
テーブル構造(table2,2,coly).

%%%  汎用述語  %%%

テーブルの選択(_テーブル名,_鍵名ならび,_鍵変数ならび,L,P) :-
        findall(_,テーブル構造(_テーブル名,_,_),L),
        P =.. [_テーブル名|L],
        鍵変数の指定(_テーブル名,L,_鍵名ならび,_鍵変数ならび).

鍵変数の指定(_テーブル名,L,[],[]) :- !.
鍵変数の指定(_テーブル名,L,[_鍵名|R1],[_鍵変数|R2]) :-
        テーブル構造(_テーブル名,_位置,_鍵名),
        list_nth(_位置,L,_鍵変数),
        鍵変数の指定(_テーブル名,R1,R2,L).