SQLのleft join結合条件について

このQ&Aのポイント
  • left joinを使用したテーブルの結合条件は、テーブルAとテーブルBの中にあるカラムを比較する必要があります。
  • 結合条件には、テーブルAとテーブルBの中に実際に存在するカラムのみを使用することができます。
  • left joinの結合条件は、テーブルAの中のカラムとテーブルBの中のカラムを比較するため、両方のテーブルに存在しないカラムは使用することができません。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.2

> (1)二つのテーブルの両方に存在するカラムの比較が全くなくても、式自体が > 成り立っていたらOKという事ですか? > > それとも、 > > (2)最低1つは、(2つのテーブルに存在するカラムの比較)が必要で、 > それ以外はand等で、条件式として成り立つものならなんでもOKという意味ですか? 実際に実行してみましたか?  SELECT *  FROM Table_A LEFT JOIN Table_B ON 1 = 1 といった書き方も可能ですから、(1)が正解です。

hayaken73
質問者

お礼

>実際に実行してみましたか? もともとは複雑な条件式に悩まされ、散々実験してみましたが、 どうにも結果に自信が持てず質問させていただきました。 いずれにしても確かな回答にたどり着き、安心しました。 本当にありがとうございます。

その他の回答 (1)

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

条件式として成り立つものであればどのように書いても問題ありません。

hayaken73
質問者

お礼

早速のご回答ありがとうございます。

hayaken73
質問者

補足

ご回答に関して確認ですが、(くどくてすいません。心配なもので。) 『条件式として成り立つもの』とは、 on以下の条件式に、 (1)二つのテーブルの両方に存在するカラムの比較が全くなくても、式自体が 成り立っていたらOKという事ですか? それとも、 (2)最低1つは、(2つのテーブルに存在するカラムの比較)が必要で、 それ以外はand等で、条件式として成り立つものならなんでもOKという意味ですか? 私にとって上記が重要なので、確認をしていただければ幸いです。 よろしくお願いします。

関連するQ&A

  • 少し複雑な left join

    まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。

  • どちらのLEFT JOINが早いでしょうか?

    下記2つのテーブルがあったとします。 ・大テーブルA 7000万件 ・小テーブルB 2000件(※現在はWHERE句で指定すると1件) をJOINする場合、下記のどちらの方法が望ましいでしょうか? 案1)子テーブルを親とする方法 テーブルA(ON句により1件~2000件) LEFT JOIN 7000万件のテーブルB 案2)親テーブルを子とする方法 7000万件のテーブルB LEFT JOIN テーブルA(ON句により1件~2000件) 又、LEFT JOINの、ON句で条件を絞るのと、 WHERE句で条件を絞るのではどちらが好ましいでしょうか?

    • ベストアンサー
    • 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
  • 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 と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 以上、ご教示お願い致します。

    • ベストアンサー
    • MySQL
  • left join が3つ以上のとき

    例えば select * from ((t1 left join t2 on t1.a=t2.a)left join t3 on t1.a=t3.a) where b.t1='y'; という風にカッコがついて記入しにくくなります。 4つの場合はさらに深刻です。 簡単な記法はないのでしょうか?

  • Left outer join とかのLeft

    Left outer join とright outer join ですが、解説などをみると、左右に表が描かれてあって、線を引いたりして結合していくのですが、 何をもって左とか右とかいうのでしょうか? テーブル1が左で、テーブル2が右みたいな感じで解説されるのですが、先に出てきた1も、あとに出てきた2も、単に出てきた順番であり、記号と思われます。1と2を入れ替えたら同じことです。Left outer join Table1 もRight outer join Table2 も同じことのように思われます。私はなにか勘違いしているのでしょうか?

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

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

  • 時間の比較(sql)

    予約システムの時間を管理するような部分の記述がわかりません。 時間を比較するにあたり、ある値から1時間引いた値を利用したい ですが、その1時間を引くという記述がわかりません。 以下の5行目の一番最後の部分はどう記述したら良いですか? 1: "select *from 2: timeTpl as t left join booked as b 3: on t.bookTime>=b.rsvTime and t.bookTime<b.finishTime 4: && 5: t.bookTime<b.rsvTime and t.bookTime<'b.rsvTime - 01:00:00' 6: where b.rsvTime is not null";  ↑ うまくうごきません。 [db] ・timeTpl : 予約時間の候補を納めたテーブル   (ex.10:30,11:00,11:30,12,00・・・・) ・booked : すでに予約済みのデーターを収めたテーブル (予約時間rsvTime=(来店時間)、矯正時間startTime、矯正終了時間finishTime) ※時間の関係する部分は"time型"となってます。 ちなみに最終的に行いたいことは・・・ コースごとに取得できる予約時間が決まっています。(timeTpl) 予約時間の30分後から矯正が始まり、その1時間後に終了します。 timeTpl(予約候補時間)の中から、予約可能なものだけを表示したい。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL SERVER2005のJOINについて

    はじめて投稿させていただきます。 SQL SERVER2005のJOINの仕方で困っています。 どなたか、アドバイスをお願いできないでしょうか。 テーブルA CD NAME KBN 1 山田太郎 1 2 山田花子 1 3 山田次郎 2 4 山田五郎 1 テーブルB CD NENGETU DAY1 DAY2 DAY3 ~ DAY31 1 200811 ◎ ◎   1 200812 ◎ 3 200810 3 200811 ◎ 4 200811 ◎ 欲しい結果の条件と結果は テーブルAは、KBN = 1 のみ テーブルBは、NENGETU = 200811 但し、テーブルBには、テーブルAに存在しないCDもあります。 CD NAME KBN DAY1 DAY2 DAY3 ~ DAY31 1 山田太郎 1 ◎ ◎   2 山田花子 1 4 山田五郎 1  ◎ 以上の結果を取得したいSQLを書きたいのですが、 Select CD,NAME,KBN,DAY1,DAY2,DAY3~,DAY31 From テーブルA LEFT OUTER JOIN テーブルB On テーブルA.CD = (Select テーブルB.CD From テーブルB Where テーブルB.NENGETU = 200811) Where テーブルA.KBN = '1' Order By テーブルA.CD とかでやると、CDの1が複数出たりして おかしい結果になってしまいます。 どなたか、アドバイスをお願いできないでしょうか。