このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/365
#  ・DB名:Firebird1.03 
#  ・テーブル 
#   ■メイン 
#    受注番号 受注日 注文社 
#    11    2011/12/20 A社 
#    12    2011/12/21 B社 
#   ■サブ 
#    連番 受注番号 商品コード 数 
#    50  11    A10    100 
#    51  11    C30    20 
#    52  12    A10    10 
#   ■商品 
#    商品コード 商品名 カテゴリ 納品番号(商品ごとで重複していません) 
#    A10     コート 洋服   100 
#    C30     帯   和服   504 
#   
#  メインの受注番号とサブの受注番号、サブの商品コードと商品の商品コードで 
#  リンクしています。 
#   
#  欲しい結果 
#  受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、 
#  受注の全内容(商品)が知りたいです。 
#  受注日:2011/12/01から12/31まで 
#  カテゴリ:洋服 納品番号:100で検索をして 
#   
#  受注番号 受注日 注文者 商品コード 商品名 数量 
#  11    2011/12/20 A社 A10    コート 100 
#  11    2011/12/20 A社 C30    帯   20----★ 
#  12    2011/12/21 B社 A10    コート 10 
#  ★受注の全内容が知りたいので、該当する受注番号のサブはすべて表示 
#  したい。メインの内容は重複表示となります。 
#   
#  丸投げですみませんが、どなたかSQL文をお願いできませんでしょうか。 
#  テーブルが3つになるとどうしてよいものかわからないです。 
#  よろしくお願いします。 
#   
# 
# 

'受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、受注の全内容(商品)が知りたい'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号) :-
        受注番号候補を得る(_受注日下限,_受注日上限,_カテゴリ,_納品番号,_受注番号ならび),
        findall([_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量],(
                    append(_,[_受注番号|_],_受注番号ならび),
                    受注番号を鍵にデータベースからの選択(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量)),
                LL1),
        整列(LL1,LL2),
        表示する(LL2).

受注番号候補を得る(_受注日下限,_受注日上限,_カテゴリ,_納品番号,_受注番号ならび) :-
        findsetof(_受注番号,(
                    メイン(_受注番号,_受注日,_注文社),
                    _受注日 @>= _受注日下限,
                    _受注日 @=< _受注日上限,
                    サブ(_連番,_受注番号,_商品コード,_数量),
                    商品(_商品コード,_商品名,_カテゴリ,_納品番号)),
                _受注番号ならび).

受注番号を鍵にデータベースを結合(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量) :-
        メイン(_受注番号,_受注日,_注文社),
        サブ(_連番,_受注番号,_商品コード,_数量),
        商品(_商品コード,_商品名,_カテゴリ,_納品番号).

表示する(LL) :-
        write('受注番号 受注日 注文者 商品コード 商品名 数量\n'),
        append(_,[[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]|R],LL),
        writef('%10l %8l %8c %8c %8c %14l %8r\n',[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]),
        R = [].