質問: 前任者からの引き継ぎが足らず、困っております。 SQLに不慣れなもので、どなたかご教示下さい。 4つのテーブルからなるデータベースからデータを抽出したいのですが、解決出来ずにおります。 テーブル構成は 1.通話履歴テーブル CALL_ID(ユニーク) 顧客ID(=顧客テーブル.顧客ID) アクション名 通話日時 対応優先度 2.顧客テーブル 顧客ID(ユニーク) 電話番号 住所 氏名 etc 3.電話番号履歴管理テーブル 登録日 電話番号 区分ID(=区分管理テーブル.区分ID) 4.区分管理テーブル 区分ID(ユニーク) 区分 という構成で、ここから、 顧客テーブル.電話番号, 通話履歴テーブル.アクション名, 通話履歴テーブル.対応優先度, 区分管理テーブル.区分 を一覧取得する必要があります。 これまでは単純にJOINするだけで実現出来ておりましたが、電話番号履歴管理テーブルに登録したデータに重複するケースがあり、条件をつけてデータを抽出しなければなりません。 例えば 2015/01/01にXという区分で09011112222という電話番号が登録されており、かつ、 2016/01/01にYという区分で09011112222という電話番号が登録されています この時に2015/07/01に09011112222と通話した記録でデータを抽出するときに、 区分管理テーブル.区分はXで抽出しなければなりません。 つまり、通話した時点での区分を抽出したいのです。 このような組み合わせが多数あり、お手上げです。 抽出対象期間が2015/06/01~2016/01/01の通話履歴だとしたら、どのようなSQLなら、実現できますでしょうか?
回答: > > 2015/01/01にXという区分で09011112222という電話番号が登録されており、かつ、 > > 2016/01/01にYという区分で09011112222という電話番号が登録されています > > 抽出対象期間が2015/06/01~2016/01/01の通話履歴 > > > この条件で抽出する場合、期待結果は ・2015/06/01~2015/12/31までの09011112222の通話履歴には区分X ・2016/01/01の09011112222の通話履歴にだけ区分Y が表示されれば良いということでしょうか? 恐らく相関サブクエリにせざるをえないので、抽出行が多いと遅くなるかも知れませんがこんな感じでどうでしょうか? ``` SELECT 顧客テーブル.電話番号 , 通話履歴テーブル.アクション名 , 通話履歴テーブル.対応優先度 , kubun.区分 FROM 通話履歴テーブル LEFT JOIN 顧客テーブル ON 通話履歴テーブル.顧客ID = 顧客テーブル.顧客ID LEFT JOIN ( SELECT 区分管理テーブル.区分, 電話番号履歴管理テーブル.電話番号 FROM 電話番号履歴管理テーブル LEFT JOIN 区分管理テーブル ON 電話番号履歴管理テーブル.区分ID = 区分管理テーブル.区分ID WHERE 電話番号履歴管理テーブル.電話番号 = 通話履歴テーブル.電話番号 AND 電話番号履歴管理テーブル.登録日 <= 通話履歴テーブル.通話日時 ORDER BY 電話番号履歴管理テーブル.登録日 desc LIMIT 1 ) kubun ON kubun.電話番号 = 通話履歴テーブル.電話番号 WHERE 通話履歴テーブル.通話日時 BETWEEN '2015/06/01' AND '2016/01/01' ``` 所で、 1. ユーザ毎に通話履歴は複数あると思いますが、CALL_IDや通話日時は出力しなくても良いのでしょうか? 2. 2015/06/01に通話履歴があるのに、電話番号履歴管理テーブル に2015/06/01以前にその電話番号の登録が無いといった可能性は無いですよね?(このようなデータがあった場合、上記SQLでは区分に空白(NULL)が出力されます)