このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/648
#  MySQL 5.5.28を使用しています。 
#   
#  テーブルAとBを対象として 
#  以下の出力結果を取得したいと考えているのですが、 
#  どのようなSQL文を記述すればよいでしょうか? 
#   
#  どなたかお知恵を拝借させてください。 
#   
#  1.テーブルAの「item_cd」と「use_date」を抽出。 
#   
#  2.テーブルBから、以下の条件で「status」を抽出。 
#   
#    “「item_cd」が一致” 
#    “「use_date」を起点とした直近の「chg_date」” 
#   
#    ※条件に該当するレコードがない場合はNULL。 
#   
#  3.1〜2により、テーブルAの各レコードについて 
#    「item_cd」の「use_date」時点における「status」を出力。 
#   
#   
#  【テーブルA】(キー:id) 
#  ------------------------------------------ 
#  id item_cd use_date 
#  ------------------------------------------ 
#  1 111 2012-04-01 
#  2 111 2013-04-01 
#  3 111 2014-04-01 
#  4 222 2014-04-01 
#  5 333 2014-04-01 
#   
#  【テーブルB】(キー:item_cd + chg_date) 
#  ------------------------------------------ 
#  item_cd status chg_date 
#  ------------------------------------------ 
#  111 11 2013-01-01 
#  111 12 2014-01-01 
#  222 21 2012-01-01 
#   
#  【出力結果】 
#  ------------------------------------------ 
#  id item_cd use_date status chg_date 
#  ------------------------------------------ 
#  1 111 2012-04-01 NULL NULL 
#  2 111 2013-04-01 11 2013-01-01 
#  3 111 2014-04-01 12 2014-01-01 
#  4 222 2014-04-01 21 2012-01-01 
#  5 333 2014-04-01 NULL NULL 
#   
#   
#  以上です。 
#  よろしくお願いします。 
# 
# 

'【出力結果】' :-
        forall('3.1〜2により、テーブルAの各レコードについて
  「item_cd」の「use_date」時点における「status」を出力。'(_id,_item_cd,_use_date,_status,_chg_date),
        writef('%3c%4r%w%5l%w\n',[_id,_item_cd,_use_date,_status,_chg_date])).

'1.テーブルAの「item_cd」と「use_date」を抽出。'(_id,_item_cd,_use_date) :-
        テーブルA(_id,_item_cd,_use_date).

'2.テーブルBから、以下の条件で「status」を抽出。

  “「item_cd」が一致”
  “「use_date」を起点とした直近の「chg_date」”

  ※条件に該当するレコードがない場合はNULL。'(_item_cd,_use_date,_status,_chg_date) :-
        テーブルB(_item_cd,_status,_chg_date),
        _chg_date @>= _use_date,!.

'3.1〜2により、テーブルAの各レコードについて
  「item_cd」の「use_date」時点における「status」を出力。'(_id,_item_cd,_use_date,_status,_chg_date) :-
        '1.テーブルAの「item_cd」と「use_date」を抽出。'(_id,_item_cd,_use_date),
        '2.テーブルBから、以下の条件で「status」を抽出。

  “「item_cd」が一致”
  “「use_date」を起点とした直近の「chg_date」”

  ※条件に該当するレコードがない場合はNULL。'(_item_cd,_use_date,_status,_chg_date).


'テーブルA'(1,111,2012-04-01). 
'テーブルA'(2,111,2013-04-01).
'テーブルA'(3,111,2014-04-01).
'テーブルA'(4,222,2014-04-01).
'テーブルA'(5,333,2014-04-01).


'テーブルB'(111,11,2013-01-01).
'テーブルB'(111,12,2014-01-01).
'テーブルB'(222,21,2012-01-01).