?- 'a##'. sql12-584#
このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/584
#   MySQL 5.5.19   .   長くなりますので 
#  テーブルの定義・内容と欲しい結果はここに 
#  http://ime.nu/codepad.org/oe1jhVrF 
#   
#  で、 
# 
#  create table a_tbl(
#  code int(9) not null,
#  input_date date not null,
#  data1 double(9,2) unsigned default 0 not null,
#  data2 double(9,2) unsigned default 0 not null,
#  primary key(code,input_date)
#  ) ;
#  
#  insert into a_tbl
#  values
#  (1111,'2012-02-01',10,12),
#  (1111,'2012-02-02',133,14),
#  (1111,'2012-02-04',13,15),
#  (1111,'2012-02-06',13,10);
#  
#  create table b_tbl(
#  code varchar(10) not null,
#  input_date date not null,
#  data1 double(9,2) unsigned default 0 not null,
#  data2 double(9,2) unsigned default 0 not null,
#  primary key(code,input_date)
#  ) ;
#  
#  insert into b_tbl
#  values
#  ('ddd','2012-02-01',122,13),
#  ('ddd','2012-02-03',127,18),
#  ('ddd','2012-02-04',11,14),
#  ('ddd','2012-02-05',16,95),
#  ('ddd','2012-02-06',13,10);
#  
#  欲しい結果 
#  input_date    a.data1  a.data2    b.data2
#  2012-02-01   10         12         13
#  2012-02-02  133         14       null
#  2012-02-03  null      null         18
#  2012-02-04   13         15         14
#  2012-02-05  null      null         95
#  2012-02-06   13         10         10
#  
#  
#  select a.input_date,b.input_date,a.data1,a.data2,b.data2 
#  from a_tbl a 
#  right join b_tbl b 
#  on a.input_date = b.input_date;  とすると、結果が 
#  +------------+------------+-------+-------+-------+ 
#  | input_date | input_date | data1 | data2 | data2 | 
#  +------------+------------+-------+-------+-------+ 
#  | 2012-02-01 | 2012-02-01 |    10 |    12 |    13 | 
#  | NULL       | 2012-02-03 | NULL  | NULL  |    18 | 
#  | 2012-02-04 | 2012-02-04 |    13 |    15 |    14 | 
#  | NULL       | 2012-02-05 | NULL  | NULL  |    95 | 
#  | 2012-02-06 | 2012-02-06 |    13 |    10 |    10 | 
#  +------------+------------+-------+-------+-------+ 
#  なんですが、実際にはいろんなコードが入っているので、コードも抽出条件に入れたら 
#  select a.input_date,b.input_date,a.data1,a.data2,b.data2 
#  from a_tbl a 
#  right join b_tbl b 
#  on a.input_date = b.input_date 
#  where  
#  a.code=1111 and b.code='ddd'; 
#  +------------+------------+-------+-------+-------+ 
#  | input_date | input_date | data1 | data2 | data2 | 
#  +------------+------------+-------+-------+-------+ 
#  | 2012-02-01 | 2012-02-01 |    10 |    12 |    13 | 
#  | 2012-02-04 | 2012-02-04 |    13 |    15 |    14 | 
#  | 2012-02-06 | 2012-02-06 |    13 |    10 |    10 | 
#  +------------+------------+-------+-------+-------+ 
#  になってしまいました。 
#  コードを抽出条件に入れた状態で望ましい結果または上の方の結果になるようなSQLを教えて下さい。 
# 

'input_dateの集合を得る'(_input_dateの集合) :-
        findall(_input_date,a_tbl(_input_date,_,_),L1),
        findall(_input_date,b_tbl(_input_date,_,_),L2),
        append(L1,L2,L3),
        setof(_input_date,member(_input_date,L3),_input_dateの集合).

抽出(_input_date,_tbl_aのdata1ならび,_tbl_aのdata2ならび,_tbl_bのdata2ならび) :-
        'input_dateの集合を得る'(_input_dateの集合),
        member(_input_date,_input_dateの集合),
        findall([_data1],tbl_a(_,_input_date,_data1,_),_tbl_aのdata1ならび),
        findall([_data2],tbl_a(_,_input_date,_,_data2),_tbl_aのdata2ならび),
        findall([_data2],tbl_b(_,_input_date,_,_data2),_tbl_bのdata2ならび).