• ベストアンサー
  • 困ってます

LEFT JOIN とRIGHT JOINの合体版のような結合方法。

LEFT JOIN とRIGHT JOINの合体版のような結合方法。 使用DBはMySQL5.0.45です。 2つのテーブルの結合方式で、結合条件に合致しなかった場合、 両方のデータを結果セットに含めることはできますか? LEFT JOINだと、左側のテーブルのデータは結果に返ってきて、右側のデータはNULLになります。 RIGHT JOINだと、右側のテーブルのデータは結果に返ってきて、左側のデータはNULLになります。 これを「左側データあり右側NULL」「左側NULL右側データあり」というレコードを混ぜて結果として返したいです。 具体的には、 以下二つのテーブルがあるとします。 table : test1 value  id ------------------- ああ   3 いい   4 うう     5 table : test2 value  id -------------------- AAA   1 BBB   2 CCC   3 DDD   4 id を結合条件のキーとして、以下のような結果を得たいです。 NULL  NULL  AAA   1 NULL  NULL  BBB   2 ああ   3     CCC   3 いい   4     DDD   4 うう    5    NULL   NULL LEFT JOINだと以下の結果に、 SELECT * FROM test1 LEFT JOIN test2 ON test1.id=test2.id ああ   3     CCC   3 いい   4     DDD   4 うう    5    NULL   NULL RIGHT JOINだと以下の結果になってしまいます。 SELECT * FROM test1 RIGHT JOIN test2 ON test1.id=test2.id NULL  NULL  AAA   1 NULL  NULL  BBB   2 ああ   3     CCC   3 いい   4     DDD   4 以上、ご教示お願い致します。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数2151
  • ありがとう数16

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

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

先に回答してくださっている方のおっしゃる通り、MySQLでは完全外部結合 をサポートしていないようです。 蛇足かもしれませんが、完全外部結合はまさしく質問者様がやりたい事そのままの ないようです。文法的には SELECT * FROM test1 FULL OUTER JOIN test2 ON test1.id=test2.id で、ORACLEなどでは質問者様の要望通りの結果が返ってきます。 先に回答して下さっている方の別解として、RIGHT JOINとLEFT JOINをUNIONする というものもご紹介します。 質問者様の載せていた2つのSQLをUNIONするだけです。 SELECT * FROM test1 LEFT JOIN test2 ON test1.id=test2.id UNION SELECT * FROM test1 RIGHT JOIN test2 ON test1.id=test2.id ご参考までに。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

完全外部結合というのですね。 mysqlで無いということで今後に期待します。 ありがとうございます。

関連するQ&A

  • LEFT JOINとRIGHT JOINについて

    SQL初心者です。 基本的な質問ですみません、教えてください。 LEFT JOINとRIGHT JOINについて、どちらのテーブルを左側、どちらのテーブルを右側にするのかが分かっていません。どういう基準で左側、どういう基準で右側と考えれてばいいのでしょうか? 宜しくお願いします。

  • LEFT JOIN の結合結果について

    お世話になります。 ”SELECT Aテーブル.* Bテーブル.*  FROM Aテーブル LEFT JOIN Bテーブル ON Aテーブル.KEY = Bテーブル.KEY”を 行った場合、Aテーブルにしか存在しないデータのBテーブル側の値は常にNULLに なるようなのですが、この場合ゼロを固定に設定することは出来ないでしょうか? よろしくお願いします。 ※ORACLE 9i、PL/SQL上での処理を考えています

  • Access 2000 サブクエリとJOIN

    Access2000でSQLを発行したのですが、 エラーが出てしまいます。 テーブル(仮にtest1、test2)があるとして test1 ------------------------- 主キー | 番号|項目    1|  1|りんご    2|  2|ぶどう    3|  3|みかん    4|  4|いちご test2 ----------------------------- 一つ目|二つ目| 1| 2| 4| 1| ・・・略 test2には2つのフィールドがあり、1,2,3,4を既定値として 入れるようにしています。 やりたいとこは、test2をグループ化し「一つ目」と「二つ目」 の規定値の個数(1、2、3、4)それぞれのカウントを求めたいのです。 一つのフィールドの場合は、 select * from test1 join test2 test1.番号=test2.一つ目 group by test1.番号 で求められたのですが、二つのフィールドをグループ化した際、 一つ目のフィールドと同じ個数が二つ目のフィールドにコピーされてしまうのです。 ですので、FROM句でサブクエリを結合しその中で、 group化したものを、いくつかのサブクエリと結合し てみたのですが、うまくいきませんでした。 select cnt1.一つ目,cnt2.二つ目 from (select * from test1 left join test2 on test1.番号=test2.一つ目group by test1.番号) as cnt1 left join (select * from test1 left join test2 on test1.番号=test2.二つ目group by test1.番号) as cnt2 on cnt1.番号=cnt2.番号 といった形で作ってみました。 エイリアスをつけてしまった時点でエラーが出ているので、 どうにもしようがありません。 申し訳ないのですが、ご教授のほどよろしくお願いいたします。

その他の回答 (1)

  • 回答No.1
  • yambejp
  • ベストアンサー率51% (3827/7415)

私の記憶ではmysqlは完全外部結合をサポートしていないような・・・ ただしUNIONでidを拾って、LEFT JOINを2度することで対応は可能です。 SELECT t1.*,t2.* FROM (SELECT id from test1 union SELECT id from test2) AS SUB LEFT JOIN test1 as t1 using(id) LEFT JOIN test2 as t2 using(id) ORDER BY SUB.id

共感・感謝の気持ちを伝えよう!

質問者からのお礼

完全外部結合というのですね。 mysqlで無いということで今後に期待します。 ありがとうございます。

関連するQ&A

  • MySQLでLEFT JOIN

    MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id

    • ベストアンサー
    • MySQL
  • left joinなどで結合対象のレコードから1件だけ得る方法は

    テーブル1 番号(ユニーク) その他のデータ 1  データ 2  データ 3  データ ... テーブル2 番号 名前 その他のデータ 1  名前A データ 1  名前A データ 2  名前B データ 3  名前C データ 3  名前C データ ... を、結合を使って 1  名前A テーブル1のデータ 2  名前B テーブル1のデータ 3  名前C テーブル1のデータ ...というようにしたいのですが、group by をつかわないで得る方法はありますか?(対象テーブルから1件だけ結合したい。) たとえば、複数の結合をこのようにした時、if()の中のカウントが、他の結合の影響を受けてしまいます。 select a.*,b.名前,if(count(c.番号) > 1,"複数",c.名前) from テーブル1 a left join テーブル2 b on b.番号 = a.番号 left join テーブル3 c on c.番号 = a.番号 group by a.番号,b.番号,c.番号 わかりづらい質問ですみません。

  • LEFT JOINの使い方

    linkテーブルとcommentテーブルがあります。 下記のようなSQLをPHPから発行すると、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from comment AS c LEFT JOIN link AS l ON c.pid=l.id order by c.id desc LIMIT 0, 10; $rec['cid'] や $rec['cname'] にはデータがあるのですが $rec['id'] や $rec['url'] にはデータが入っておらずNULLになってしまいます。 ためしに LEFT JOINの左右を下記のように入れ替えみたところ、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from link AS l JOIN comment AS c LEFT ON c.pid=l.id order by c.id desc LIMIT 0, 10; 今度は $rec['id'] や $rec['url'] にはデータがあるのですが $rec['cid'] や $rec['cname'] にはデータが入っておらずNULLになってしまいました。 どこがおかしいのでしょうか? MYSQLは5.1.22-rcでレンタルサーバーはcoreserverを利用しています。

    • ベストアンサー
    • MySQL
  • sql express内部結合して重複行を削除する

    お世話になります。  当方、SQL server expressを使用しており、以下の2テーブルをフローIDで内部結合しています。 test1         test2 順番、フローID   通番、フローID、タイトル 更新日時 1    1       1    1    てすと   12/1 2    2        2    1     テスト2  12/2 3     3       3    2    テスト3   12/3              4    3    テスト4   12/4 SELECT * FROM test1 INNER JOIN test2 ON (test1.フローID=test2.フローID) 結果 順番 フローID   通番 フローID タイトル 更新日時 1    1       1   1   てすと   12/1 1    1        2   1    テスト2  12/2 2     2       3   2   テスト3   12/3 3    3        4   3   テスト4   12/4  ここで、順番=1の行で指定されているフローIDがテーブルtest2に二行存在するため、結合した結果も順番=1に対して二行になっています。  これを、test2のフローIDが重複する場合はtest2の更新日時が新しいほうだけを表示するようにしたいと考えています。  ご教授頂けますと幸いです。  感覚としては、test2テーブルをgroup by句でまとめたものをテーブルとして定義して、内部結合できればよさそうなのですが、上手い資料が見つかりませんでした。  クエリでも、ストアドプロシージャとしての実行でも構いません。

  • left join?で実現できそうなこのクエリを一行で書いてみたい。

    left joinについてお聞きします。一行で実現できるのかどうか、興味があります。 student | id | name | class | | 1 | aaa | 1 | | 2 | bbb | 3 | | 3 | ccc | 4 | | 4 | ddd | 3 | | 5 | eee | 1 | iinkai | id | student.id | name | meeting | | 1 | 1 | tosho | 2006-11-30 | | 2 | 2 | souji | 2006-12-02 | | 3 | 2 | siiku | 2006-12-03 | | 4 | 3 | tosho | 2006-11-30 | ルール ・studentからclassが3,4,5の生徒を抽出 ・iinkaiに所属していなくても生徒は抽出 ・所属していても、全てのmeetingが既に終わっていればいらない ・複数のiinkaiに所属している場合は、2006-12-01以降にmeetingが行われるもので直近のinnkaiを表示する 結果として欲しいテーブルは | student.id | class | iinkai.id | iinkai.name | meeting | | 2 | 3 | 2 | souji | 2006-12-02 | | 3 | 4 | null | null | null | | 4 | 3 | null | null | null | 文字数が足りません。ご教授お願いします。

    • ベストアンサー
    • MySQL
  • sqlserver2005 JOINしてUNION

    現在下記のSQL文で会社単位で訪問回数と請負費を出していますが。 JOINしているテーブルをUNION(複数テーブルの合計)するにはどうしたらいいですか? (テーブルは社員単位で作成しています) SELECT TEST11.会社名, SUM(TEST2.訪問回数) AS 訪問回数, SUM(TEST2.訪問回数 * TEST2.単価) AS 請負費 FROM TEST11 RIGHT OUTER JOIN TEST2 ON TEST11.訪問日 = TEST2.訪問日 AND TEST11.区分コード = TEST2.管理番号 GROUP BY TEST11.会社名 ORDER BY TEST11.会社名 結果は下記になってます |会社名|訪問回数|請負費| 分る方ご教授頂けると幸いです

  • 固定値を含む結合と複数テーブルの結合について

    「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。

  • MySQLのLEFT JOINについて

    LEFT JOINを使ったMySQLに挑戦しています。 テーブルとテーブルを照らしあわせ、右側のテーブルに優先的に表示する方法ですが、1つのテーブルと1つのテーブルではなく1つのテーブルに対して複数のテーブルと照合する方法とはあるのでしょうか? どうかおしえていただけないでしょうか? 下記に作成中のソースを示します。 宜しくお願いします。 $STRSQL=qq{SELECT }; $STRSQL=$STRSQL.qq{kyu_table.iput_charg_id,k_data_m_table.iput_charg_id }; $STRSQL=$STRSQL.qq{FROM k_data_m_table LEFT JOIN kyu_table ON k_data_m_table.iput_charg_id = kyu_table.iput_charg_id }; $STRSQL=$STRSQL.qq{WHERE k_data_m_table.iput_charg_id = "$KYU" };

  • sql(left join)の結合条件のルール

    (テーブルA)と(テーブルB)をleft joinした際の結合条件について 詳しい方に伺いたいのですが、 on以下の部分は、(テーブルAの中にあるカラム)と(テーブルBの中にあるカラム)を 比較するような文でなければいけないですか? 例えば、、、 ------------------------------------------------------------------------- SELECT * FROM  timeTpl2 AS t LEFT JOIN booked AS b ON  t.start = b.startTime AND  b.settingDay = $day ------------------------------------------------------------------------- 上記の最後の部分(b.settingDay = $day)は テーブルbにしかない要素を変数($day)と比較しています。 ◆疑問 記述としてだいじょうぶかどうかを知りたいです。 つまりon以下結合条件は必ず左右のテーブルの、存在するカラム のみしか比較する事ができないかどうかが知りたいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • LEFT JOINが2つあるSQL文でANDの意味

    ■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a  LEFT JOIN being b ON a.hoge_id = b.id  LEFT JOIN call c ON c.call_id = a.hoge_id   AND f.hoge_id = 12  WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

    • ベストアンサー
    • MySQL