このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1274791771/408
#  よろしくお願いいたします。 
#   
#  ・DBMS名とバージョン  
#    HiRDB Ver8 
#   
#  ・テーブルデータ 
#  <Aテーブル> 
#  A1   A2   A3   A4   A5 
#  ------- ------- ------- ------- ---------- 
#  XXXXXXX XX1   ABC    3       2009/05/08 
#  WWCWWCW WW2   CCB    1       2008/03/21 
#  DDDDDDD DD1   JPN    5       2007/08/08 
#  GGGGGGG GX9   SOX    2       1977/01/04 
#  FFFFFFF USJ   NPB    3       2001/09/11 
#   
#   
#  <Bテーブル> 
#  B1   B2   B3   B4   B5 
#  ------- ------- ------- ------- ---------- 
#  XXXXXXX XX1  ibicha  oshimu  2002/07/05 
#  XXXXXXX XX1  takeshi  okada   2005/07/15 
#  XXXXXXX XX1  kamo     shu     1857/09/25 
#  WWCWWCW WW2  wao      wao     2008/10/22 
#  DDDDDDD DD1  ui       hhh     2006/06/30 
#  DDDDDDD DD1  jojoj    x5xx    1999/09/09 
#  DDDDDDD DD1  momo     hara    2005/03/07 
#  DDDDDDD DD1  itai     u-      2003/12/22 
#  DDDDDDD DD1  koma     nogoal  2007/04/26 
#  GGGGGGG GX9   dame     record  2009/11/14 
#  FFFFFFF USJ   iki      tai     1995/08/15 
#  FFFFFFF USJ  sst      ebuspi  2004/01/05 
#  FFFFFFF USJ  bb       pp      2009/08/23 
#   
#  ・欲しい結果  
#  A1   A2   B1   B2   A4      B1andB2COUNT 
#  ------- ------  ------- ------- ------- ------------ 
#  GGGGGGG GX9     GGGGGGG GX9     2       1 
#   
#   
#  ・説明  
#  SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。 
#  A1とB1は、A2とB2は同じデータが基本です。 
#  Aテーブルの「A4」カラムにはBテーブルのレコード数を持っています。 
#  しかし、よくよく見るとAテーブルの「GGGGGGG」のA4には「2」のはずなのにBテーブルには実際にレコードは1つしかありません。 
#  こういう状態になってしまっているのを割り出したいのですがどのようにA4とBテーブルで数があってないものを抽出できるでしょうか。 
#  よろしくお願いいたします。 
# 
# 

集約値A4とBテーブルの組数が不整合であるか、Bテーブルに存在する組の集約がAテーブルにない :-
        findsetof([A1,A2],'Aテーブル'(A1,A2,_,_,_),L1),
        write('集約値A4とBテーブル組の不整合'),
        集約値A4とBテーブル組の不整合(L1),
        findsetof([B1,B2],(Bテーブル'(B1,B2,_,_,_),L2),
        write('Bテーブルは存在するがAテーブルに集約されていない\n'),
        'Bテーブルは存在するがAテーブルに集約されていない'(L2),!.

集約値A4とBテーブル組の不整合([]) :- !.
集約値A4とBテーブル組の不整合([[A1,A2]|R]) :-
        'Aテーブル'(A1,A2,_,A4,_),
        count('Bテーブル'(A1,A2,_,_,_),Count),
        診断(A1,A2,A4,Count),
        集約値A4とBテーブル組の不整合(R).

診断(A1,A2,A4,0) :-
        write('対応するBテーブルの組がありません\n'),!.
診断(A1,A2,A4,Count) :-
        \+(A4=Count),
        write_formatted('Aテーブルのキー%t,%tの集約値A4=%tとBテーブルの同一キーのカウントが不整合です\n',[A1,A2,A4,Count]),!.
診断(_,_,_,_).


'Bテーブルは存在するがAテーブルに集約されていない'([]) :- !.
'Bテーブルは存在するがAテーブルに集約されていない'([[B1,B2]|R]) :-
        'Aテーブル'(B1,B2,_,_,_),
        'Bテーブルは存在するがAテーブルに集約されていない'(R),!.
'Bテーブルは存在するがAテーブルに集約されていない'([[B1,B2]|R]) :-
        'Bテーブル'(B1,B2,B3,B4,B5),
        write_fromatted('Aテーブルに集約が存在しない組は%t,%tです\n',[B1,B2,B3,B4,B5]),
        'Bテーブルは存在するがAテーブルに集約されていない'(R),!.