• ベストアンサー

テーブルのどちらかにデータがない事があるテーブル結合について

■table a のテーブル構成 date a_id b_id c_id a_count ■table b のテーブル構成 date a_id b_id c_id b_count value 上記の2つのテーブル構成から、 ■date a_id b_id c_id毎の集計データ date a_id b_id c_id a_count b_count value を抽出するSQLが知りたいです。 table aにあって、table bに存在しない。又は逆もある為、 union しかないと思うのですが、思いつきません。。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

たびたびすみません。 訂正版です。もしよろしければ、お試しください。 select ifnull(A.`date`,B.`date`) as `date`, ifnull(A.`a_id`,B.`a_id`) as `a_id`, ifnull(A.`b_id`,B.`b_id`) as `b_id`, ifnull(A.`c_id`,B.`c_id`) as `c_id`,  a_count,b_count,`value` from A left join B on A.`date`=B.`date` and A.a_id=B.a_id and A.b_id=B.b_id and A.c_id=B.c_id union select ifnull(A.`date`,B.`date`) as `date`, ifnull(A.`a_id`,B.`a_id`) as `a_id`, ifnull(A.`b_id`,B.`b_id`) as `b_id`, ifnull(A.`c_id`,B.`c_id`) as `c_id`,  a_count,b_count,`value` from A right join B on A.`date`=B.`date` and A.a_id=B.a_id and A.b_id=B.b_id and A.c_id=B.c_id

すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.4

#3です。 #3のSQLでは、重複排除がうまく行きません。 失礼しました。

すると、全ての回答が全文表示されます。
回答No.3

>今回は取得するカラムが結合するテーブル毎に異なるので一発 UNIONだけでは無理なので これはどういう意味でしょうか? 質問にある「やりたいこと」に、変更はないのですよね? (date,a_id,b_id,c_id)で、お互いを対応付けているのでしょうか? 前半がAにだけあるもの、AとB両方にあるものを検索し、 後半がBにだけあるもの、AとB両方にあるものを検索、 unionで繋げるとともに(AとB両方にあるものの一方を)重複排除です。 前半と後半で、leftとrightの指定と、selectの並びで両方にある列をA側にするかB側にするかを変更するだけですよ? select A.`date`,A.a_id,A.b_id,A.c_id, # A側を表示  a_count,b_count,`value` from A left join B # Bに対応行がない場合あり on A.`date`=B.`date` and A.a_id=B.a_id and A.b_id=B.b_id and A.c_id=B.c_id union select B.`date`,B.a_id,B.b_id,B.c_id, # B側を表示  a_count,b_count,`value` from A right join B # Aに対応行がない場合あり on A.`date`=B.`date` and A.a_id=B.a_id and A.b_id=B.b_id and A.c_id=B.c_id

すると、全ての回答が全文表示されます。
回答No.2

full [outer] joinは、MySQL 5.1時点でも、未サポートになっています。 MySQL 5.0.19での動きを確認して見たところ、full joinに完全に蓋はされておらず、構文エラーにならずに動いてしまうこともありますが、full joinの動きではありません。 MySQL 5.0.xなら、left join + right join + unionで代替できます。 SQL例としては、次のような指定になります。 select * from t1 left join t2 on t1.c1=t2.c1 union select * from t1 right join t2 on t1.c1=t2.c1

php4
質問者

お礼

full outer joinというのがオラクル等にはあるのですね。ありがとうございます。 教えていただいたSQLは大変すばらしいのですが、今回は 取得するカラムが結合するテーブル毎に異なるので一発 UNIONだけでは無理なので、SQLを2回流して、 プログラムの方でデータを作成するという結論に至りました。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

mysqlのバージョンによって処理がことなります。 今回の案件は完全外部結合なので4.1以降・・・かな テンポラリを使えば3.23系でも実現は可能です

php4
質問者

お礼

完全外部結合というのですね。ありがとうございます。 すみませんバージョン書いていませんでした。 MySQL5.0.22になります。 テンポラリも検討してみますね。

すると、全ての回答が全文表示されます。

関連するQ&A