質問: sql 重複しないjoinの仕方を教えてください データが重複しないsql文の書き方を教えてください。 下記のような2つのテーブルがあり、「管理番号」でonして「使用数」をjoinさせ、かつ重複しないようにsqlを作成したいのですが、mysqlで可能でしょうか? ※0002に関しては、テーブル2の方がデータ数が多いため、join後は2行になって「使用数」は重複せず、「数」の部分には0が入ればベストです 【テーブル1】 日付 品番 管理番号 数 2012/6/12a987 0001500 2012/6/14a987 0001300 2012/6/16a987 0001400 2012/6/18a987 0001800 2012/6/12a987 0002750 2012/6/12a987 0003540 2012/6/14a987 0003740 2012/6/16a987 0003840 2012/6/18a987 0003240 2012/6/20a987 0003640 【テーブル2】 日付 品番 管理番号 使用数 2012/7/10a987 0001160 2012/7/11a987 0001260 2012/7/10a987 0002220 2012/7/12a987 0002320 2012/7/20a987 0003530 2012/7/22a987 0003430 2012/7/24a987 0003830 【テーブルjoin】 日付 品番 管理番号 数 使用数 2012/6/12a987 0001500160 2012/6/14a987 0001300260 2012/6/16a987 00014000 2012/6/18a987 00018000 2012/6/12a987 0002750220 2012/6/12a987 00020320 2012/6/12a987 0003540530 2012/6/14a987 0003740430 2012/6/16a987 0003840830 2012/6/18a987 00032400 2012/6/20a987 00036400
回答: sqlの基本がたぶんわかってないんだろうなぁ・・・という結合です >※0002に関しては、テーブル2の方がデータ数が多いため の箇所はロジックが破綻しているので、表示できるとしても「null」です 無理すれば一発でできないことはないですが、テンポラリを作りながらやると解りやすいかも。 //準備 create table テーブル1(日付 date,品番 varchar(10),管理番号 varchar(10),数 int,unique key (日付,管理番号,品番)); insert into テーブル1 values('2012-06-12','a987','0001',500),('2012-06-14','a987','0001',300),('2012-06-16','a987','0001',400),('2012-06-18','a987','0001',800),('2012-06-12','a987','0002',750),('2012-06-12','a987','0003',540),('2012-06-14','a987','0003',740),('2012-06-16','a987','0003',840),('2012-06-18','a987','0003',240),('2012-06-20','a987','0003',640); create table テーブル2(日付 date,品番 varchar(10),管理番号 varchar(10),使用数 int,unique key (日付,管理番号,品番)); insert into テーブル2 values('2012-7-10','a987','0001',160),('2012-7-11','a987','0001',260),('2012-7-10','a987','0002',220),('2012-7-12','a987','0002',320),('2012-7-20','a987','0003',530),('2012-7-22','a987','0003',430),('2012-7-24','a987','0003',830); //抽出sql create temporary table temp_t1 select (select count(*) +1 from テーブル1 as t1b where t1a.日付 > t1b.日付 and t1a.管理番号=t1b.管理番号 and t1a.品番=t1b.品番) as rank,日付,品番,管理番号,数 from テーブル1 as t1a; create temporary table temp_t2 select (select count(*) +1 from テーブル2 as t2b where t2a.日付 > t2b.日付 and t2a.管理番号=t2b.管理番号 and t2a.品番=t2b.品番) as rank,日付,品番,管理番号,使用数 from テーブル2 as t2a; create temporary table temp_t3 select rank,管理番号,品番 from temp_t1 union select rank,管理番号,品番 from temp_t2; //表示部分 select temp_t1.日付 ,temp_t3.品番 ,temp_t3.管理番号 ,coalesce(数,0) as 数 ,coalesce(使用数,0) as 使用数 from temp_t3 left join temp_t1 on temp_t3.rank=temp_t1.rank and temp_t3.管理番号=temp_t1.管理番号 and temp_t3.品番=temp_t1.品番 left join temp_t2 on temp_t3.rank=temp_t2.rank and temp_t3.管理番号=temp_t2.管理番号 and temp_t3.品番=temp_t2.品番 order by temp_t3.管理番号,temp_t3.rank