• 締切済み

内部結合する時の結合条件と制約条件について

内部結合する時の結合条件と制約条件について 下記の例の場合の結合条件と制限条件の書き分けを 教えて下さい。 table1: no|type --------- 1| A 2| B 3| C 4| A 5| C table2: no|type|name|locale ------------------- 1| A |ネコ| ja 2| B |イヌ| ja 3| C |トリ| ja 4| A |cat | en 5| B |dog | en 6| C |bird| en 取得したいデータ: no|type|name ------------- 1| A |ネコ 2| B |イヌ 3| C |トリ 4| A |ネコ 5| C |トリ SQL: SELECT t1.no, t1.type, t2.name FROM table1 t1 INNER JOIN table2 t2 ON t1.type=t2.type AND t2.locale='ja' または SELECT t1.no, t1.type, t2.name FROM table1 t1 INNER JOIN table2 t2 ON t1.type=t2.type WHERE t2.locale='ja' となると思うのですが、 t2.locale='ja'の条件は 結合条件とするのと制限条件とするのとで 違いがあるのでしょうか? もし違いがない場合はどちらが一般的でしょうか? よろしくお願いいたします。

  • Oracle
  • 回答数2
  • ありがとう数24

みんなの回答

回答No.2

次の四つ書き方があります。(結果同じ) SELECT t1.no , t1.type , t2.name FROM table1 t1 INNER JOIN table2 t2 ON t1.type = t2.type AND t2.locale = 'ja' / SELECT t1.no , t1.type , t2.name FROM table1 t1 INNER JOIN table2 t2 ON t1.type = t2.type where t2.locale = 'ja' / SELECT t1.no , t1.type , t2.name FROM table1 t1 , table2 t2 where t1.type = t2.type and t2.locale = 'ja' / SELECT t1.no , t1.type , t2.name FROM table1 t1 , ( select no , name from table2 where locale = 'ja' ) t2 where t1.type = t2.type SQLの実行効率面を考えれば、この前の三つは同じです、最後の書き方は一番速いです。 SQL実行ログを参照してください(table1とtable2の十万件のレコードがあるケースを例とする)。 ----- VISUAL SQLTOOL 実行 Log ------------ 14:25:48:875 SQL: SELECT ... [ 行 1 - 8 ] ->: 100000 件 0.203秒 14:25:49:140 SQL: SELECT ... [ 行 11 - 18 ] ->: 100000 件 0.203秒 14:25:49:421 SQL: SELECT ... [ 行 21 - 28 ] ->: 100000 件 0.203秒 14:25:49:656 SQL: SELECT ... [ 行 31 - 40 ] ->: 100000 件 0.187秒

参考URL:
http://japan.werunsoft.com/tips.aspx?db=oracle&id=71
todoroki0120
質問者

お礼

回答ありがとうございます。 実行効率の面からの解説をしていただき、 大変勉強になりました。 質問の例にある書き方はどちらも実行効率は変わらないが インラインビューを利用した方がパフォーマンスが良いという事でしょうか。 記述方法が複数ある場合、実行効率を調査して選ぶというのも 良い方法ですね。参考になりました。 ありがとうございました。

  • dda167
  • ベストアンサー率76% (55/72)
回答No.1

結合時に評価されるか(ON) 結合後に評価されるか(WHERE) の違いがあります。 内部結合の場合、結果セットに違いは生じませんが、 外部結合の場合、結果セットが違ってくるので注意が必要です。 # 外部結合で試してください。面白いですよ。 内部結合の場合、 どちらが一般的かは 私には答えられません。 # 何が普通か # 何が一般的か # 現場によって変わります。

todoroki0120
質問者

お礼

回答ありがとうございます。 お礼が遅れてしまい、申し訳ありません。 内部結合の場合であれば、結果に差異はなく どちらを選ぶかは現場の状況に合わせて、という事ですね。 >結合時に評価されるか(ON) >結合後に評価されるか(WHERE) この表現が大変分かりやすかったです。 ありがとうございました。

関連するQ&A

  • 外部結合について

    外部結合というのは、表と表を結合するという事で FROM句に書くべきことと思うのですが、 なぜWHERE句(カラム毎に指定)で指定するのでしょうか? 例えば、 テーブルA No|Kind|Name| ------------- 1|1 |A | 1|2 |B | 2|1 |C | 2|2 |D | テーブルB No|Kind|Data| ------------- 1|1 |10| 外部結合で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind(+) とすると No|Kind|Name|Data| ------------------ 1|1 |A |10| 1|2 |B |NULL| 2|1 |C |NULL| 2|2 |D |NULL| となります。 A.NoがB.NoになくてもOKで、Kindは 完全に一致しないとだめという意味で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind とした場合、 No|Kind|Name|Data| ------------------ 1|1 |A |10| 2|1 |C |NULL| となるのであれば納得いくのですが、 結果は↓なるようです。 No|Kind|Name|Data| -------------------------- 1|1 |A |10| (+)を一つも付けてない場合と 同じ動作になるようです。 テーブルAとテーブルBを結合するとき、 「外部結合する場合はWHERE句で指定する選択の条件全てに(+)を付ける」 「外部結合をしない場合はWHERE句で指定する選択の条件全てに(+)を付けない」 であれば、カラム毎に外部結合演算子を指定する意味が無いと思うのですが。 どなたか、カラム毎に外部結合演算子を指定する意味をご教授下さい。 宜しくお願いします。

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • 2つのテーブルを結合する条件

    現在、MySQLを使用しており2つのテーブルの結合条件がわからないので教えてください。 name_masterとmeiboの2つのテーブルがあります。 meiboとname_masterを結合させてname_idとname_id2が日本語に置き換わった状態で 取得させたいと思っています。どのようにwhere句の条件を作成すればよいでしょうか。 取得する項目のイメージとしては以下の3つが取得できるようにしたいです。 「meibo.no, meibo.name_idの日本語, meibo.name_id2の日本語」 【name_masterテーブル】 id name 1  ポチ 2  タマ 3  ミケ 4  ハチ 5  タロウ 【meiboテーブル】 no  name_id  name_id2 1    3     1 2    4     2 3    5     3

    • ベストアンサー
    • MySQL
  • 内部結合に関して

    初歩的な質問で申し訳ありません。 以下のような3つのテーブルを結合する際に、ある1つのテーブルの内容を全て 表示したまま、その他のテーブルの内容を付加するような出力をしたいと考えています。 考え方としては、内部結合という事で、INNER JOIN を使うというような事は想像できますが、 3つのテーブルではそのような事が可能でしょうか? 最終的には出力想定イメージのような形としたいと考えています。 [口座] 銀行No 顧客No 残高 ------------------- B001 C001 30000 B001 C003 10000 B002 C001 40000 B002 C002 10000 B002 C004 50000 B003 C004 60000 [銀行] 銀行No 銀行名 --------------- B001 foo銀行 B002 bar銀行 [顧客] 顧客No 顧客名 -------------- C001 阿部 C002 村上 C003 渡辺 C004 越智 【出力想定イメージ】 銀行No 銀行名 顧客No 顧客名 残高 ------------------- B001 foo銀行 C001 安部 30000 B001 foo銀行 C003 渡辺 10000 B002 bar銀行 C001 安部 40000 B002 bar銀行 C002 村上 10000 B002 bar銀行 C004 越智 50000 B003 C004 越智 60000 ※ 口座情報に対し、銀行情報や顧客情報がないケースも存在します。 教えて下さい。 よろしくお願いします。

  • 多段外部結合はできる?

    mysqlにおいて、多段の外部結合はできるのか今模索しております。 例えば、A、B、Cと3つテーブルがあった場合に、 「Aに対してBを外部結合」 「Bに対してCを外部結合」 としたいのですが、どうやってもCテーブルの値が取得できず常にNULLになっている状態です。 例として、以下の条件で実行すると、Cテーブルの値が取得できません。 ---- (テーブル) A [id, name, b_id] ※b_idはB.idの外部キー B [id, name, c_id] ※c_idはC.idの外部キー C [id, name] (クエリ) select A.name, B.name, C.name from A left join B on (A.b_id = B.id) left join C on (B.c_id = C.id) ---- どうやったらうまく取得できますか?もしくはできないのでしょうか? ご存知の方、ご教授ください。

    • ベストアンサー
    • MySQL
  • 内部結合

    テーブルの自己結合について教えてください。 以下のようなテーブルAがあります。 Table A collumn1(企業名) collumn2(フラグ) B           0 C           0 D           1 B           1 C           0 E           0 E           1 E           1 これにおいて、フラグが1の企業でかつ フラグの如何に関わらず同じ企業名があればその企業名を とってきたいです。 上の例では企業BとEとなります。 企業名が同じでもフラグが0のものばかりであればとってきません。 この条件を私が考えたのは select collumn1 from A where collumn2 = 0 and collumn1 = (select collumn1 from A where collumn2 = 1) というSQLなのですが、うまく取れません。 なにも取って来なくなります。 何がいけないでしょうか。 アドバイス、よろしくお願いいたします。

  • 結合について質問です。

    結合について質問です。 ■テーブル TOIAWASE A KOKYAKU B TOIAWASE_TAISHOU C MOUSIKOMI_INFOMATION D MOUSIKOMI_INFOMATION E KINMU_MASTER F ■結合 A.KOKYAKU_NO = B.KOKYAKU_NO AND ※1:1 A.TOIAWASE_NO = C.TOIAWASE_NO(+) ※1:1 C.MOUSIKOMI_TYPE = D.MOUSIKOMI_TYPE(+) ※1:1 D.OLD_MOUSIKOMI_TYPE = E.MOUSIKOMI_TYPE(+) ※1:1 A.KINMU_CD = F.KINMU_CD(+) ※1:1 ■データ整合性について Aがある場合、Bは必ずあります。 Aがある場合、Cはあるとは限りません。 Cがある場合、Dは必ずあります。 Dがある場合、Eがあるとは限りません。 Aがある場合、Fがあるとは限りません。 Aをもとに問い合わせ一覧を取得したいです。 Aがある場合、Cがあるとは限らないため、それに紐づくテーブルは全て外部結合をするしかありません。 一応、上記SQLでも取得はできるのですが、他に良い(効率の良い)SQLはないのでしょうか? 宜しくお願いします。

  • テーブル結合方法について

    MySQL5.1で、Table a ,Table b から、Table cのように取り出したいのですが、 SQLでSELECTする方法がわかりません。 Table b優先だけど、Table aにしかデータがない場合もあるといった感じです。 Table a No  Name 1 加藤 2 佐藤 3 田中 Table b No Name 2 佐藤先輩 4 田辺先輩 Table c No Name 1 加藤 2 佐藤先輩 3 田中 4 田辺先輩 どうか、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブル結合について

    テーブルの結合についてお聞きしたいことがあります。 カラム「KEY」を結合条件に テーブルA、B、Cを結合して【取りたい結果】のようなデータを取りたいと思っています。 しかし、テーブルAにBとCをLEFT JOINを結合した所、 【取得された結果】のデータが取得されました。 どのような結合をしたら期待通りの結果が得られるのでしょうか? 回答宜しくお願いします。 【取得された結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 B-1 C-2 A-1 B-1 C-3 2 A-2 3 A-3 【取りたい結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 C-2 A-1 C-3 2 A-2 3 A-3 【テーブルA】 key dataA --------------------- 1 A-1 2 A-2 3 A-3 【テーブルB】 key dataB --------------------- 1 B-1 【テーブルC】 key dataC --------------------- 1 C-1 1 C-2 1 C-3

  • VBAで2つのデータを横に結合できますか?

    Sheet1には以下のデータが入力されています。 NO TIMES SCORE 1  1  20 1  2  30 1  3  25 2  1  50 2  2  40 2  3  45 3  1  70 3  2  75 4  3  3 いっぽうsheet2には以下のデータが入力されています。 NO  NAME  SEX  AGE 1  Aさん  男  31 2  Bさん  女  27 3  Cさん  女  33 4  Dさん  男  26 この2つのデータをNOをキーとして横に結合したいのですが VBAでこのような結合操作はできるものでしょうか? NO NAME SEX AGE TIMES SCORE 1 Aさん 男 31 1 20 1 Aさん 男 31 2 30 1 Aさん 男 31 3 25 2 Bさん 女 27 1 50 2 Bさん 女 27 2 40 2 Bさん 女 27 3 45 3 Cさん 女 33 1 70 3 Cさん 女 33 2 75 4 Dさん 男 26 3 3 if文を使ってNOが1ならNAMEがAさん、SEXが男・・・という 条件文をかけばできないこともありませんが、 実際のデータではNOが450もありますので 非効率と考えています。 もしご存知でしたら教えていただけませんか。 よろしくお願いいたします。