このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1299305530/8
#  よくある質問3 
#   
#  (問) 
#  ID HOGE 
#  01 A 
#  01 B 
#  01 C 
#  02 A 
#  03 B 
#   
#  HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか 
#   
#  (答1) 
#  SELECT id 
#  FROM TableName 
#  WHERE hoge in ('A','B','C') 
#  GROUP BY id 
#  HAVING count(DISTINCT hoge) = 3 
#  ; 
#   
#  (答2) 
#  select * 
#  from TableName T1 
#  where not exists (select * 
#           from (values 'A', 'B', 'C') T2 (HOGE) 
#           where not exists (select * 
#                    from TableName T3 
#                    where T1.ID = T3.ID 
#                    and T2.HOGE = T3.HOGE 
#                    ) 
#           ) 
#  ; 
#  ※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意 
# 
# 

'HOGEをAもBもCも持っている、ID:01だけ取り出す'(L,_ID) :-
        findsetof(_ID,'TableName'(_ID,_)),
        関係の割り算(_ID,L).

関係の割り算(_,[]):- !.
関係の割り算(_ID,[_HOGE|R]) :-
        'TableName'(_ID,_HOGE),
        関係の割り算(_ID,R).