• ベストアンサー

外部結合について

以下のSQLの2つの結果は同じでしょうか? LEFT OUTHERは、ON句の中の左の表を全て取得するというものでしょうか? SELECT ename, dname, jname FROM emp e LEFT OUTHER JOIN dept d ON (e.deptno=d.deptno) LEFT OUTHER JOIN job j ON (e.jobid=j.deptno); SELECT ename, dname, jname FROM emp e RIGHT OUTHER JOIN dept d ON (d.deptno=e.deptno) RIGHT OUTHER JOIN job j ON (j.jobid=e.deptno); よろしくお願いします。

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

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

>以下のSQLの2つの結果は同じでしょうか? 同じ結果が得られる場合もデータ次第ではあるえるけど、通常は違った結果になる。 >LEFT OUTHERは、ON句の中の左の表を全て取得するというものでしょうか? ON条件中の左側でなく、OUTERキーワードの左側です。 from A left outer B は、「Aの全件」と「条件に合うB」の結合結果が戻ります。 RIGHT OUTERの場合は、OUTERキーワードの右側が基準になります。 >LEFT OUTHER JOIN dept d ON (e.deptno=d.deptno) >LEFT OUTHER JOIN jobs j ON (e.jobid=j.deptno); >では、empとdeptで、empを全て表示 >deptとjobsでdeptを全て表示となる気がするのですが。。 from (( emp left outer join dept ) left outer join jobs ) と解釈されます。 empとdeptの結合結果に対し、jobsを結合するので、jobsの結合条件には empの項目もdeptの項目も文法上は利用可能です。 ただ、今回のように外部結合の場合は、外部結合(dept)側の項目は、NULLの可能性があり 結合条件として成立しないかもしれませんけどね。

kei2543
質問者

お礼

つまり左から順々に処理していくということですね どうもありがとうございました。

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

どこで躓いているのかわかりませんが。。 ・deptもjobsもempに対してそれぞれ結合されていることをまず理解しましょう。  結合キーを見ての通り、jobsはdeptに対して結合しているわけではありません。  SELECT ename,dname  FROM emp e  LEFT OUTER JOIN dept d ON d.deptno=e.deptno  SELECT ename,jname  FROM emp e  LEFT OUTER JOIN jobs j ON j.jobid=e.jobid ・RIGHT OUTER JOINはLEFT OUTER JOINと逆です。  emp表がすべて表示されます  SELECT ename,dname  FROM emp e  LEFT OUTER JOIN dept d ON d.deptno=e.deptno  dept表がすべて表示されます  SELECT ename,dname  FROM emp e  RIGHT OUTER JOIN dept d ON d.deptno=e.deptno ・この問題をRIGHT OUTER JOINで回答するとしたら、  SELECT ename,dname,jname  FROM dept d  RIGHT OUTER JOIN emp e ON d.deptno=e.deptno  LEFT OUTER JOIN jobs j ON j.jobid=e.jobid  書けなくはありませんが、非常にわかりにくい文になります。  どちらが主になるテーブルかが分かりにくくなるので、一般的にはRIGHT OUTER JOINは使わないようします。 (RIGHT OUTER JOINはすべてLEFT OUTER JOINを使った文に書き換えることが可能です) ※OUTHERではなく、OUTERです。

kei2543
質問者

お礼

>どちらが主になるテーブルかが分かりにくくなるので、一般的にはRIGHT OUTER JOINは使わないようします。 (RIGHT OUTER JOINはすべてLEFT OUTER JOINを使った文に書き換えることが可能です) 勉強になりました。どうもありがとうございました。

回答No.1

結果は違うと思います。 大きく違うのは、emp e表のe.deptnoがNULLとなっている行が含まれるか 含まれないか。 LEFT OUTER JOINは、左側のテーブルの行はすべて含まれますが右側のテーブルの行は左側のテーブルにマッチするものがなければ表示されません。 RIGHT OUTER JOINは逆になりますので、結果は異なります。

kei2543
質問者

お礼

すみません。この問題の回答の補足には 全ての従業員を表示するため、emp表の全ての行が表示されるように 外部結合を行う必要があります。よってdept表を結合する時と job表を結合する時にいずれもemp表の側をLEFT OUTER JOIN又は RIGHT OUTER JOINで指定します。 LEFT OUTHER JOIN dept d ON (e.deptno=d.deptno) LEFT OUTHER JOIN jobs j ON (e.jobid=j.deptno); では、empとdeptで、empを全て表示 deptとjobsでdeptを全て表示となる気がするのですが。。

kei2543
質問者

補足

回答ありがとうございます! やはり違いますよね 長いので貼り付けようか迷いましたが・・・ 下記の問題がどうしても分かりません。 emp表 empno  ename  jobid  deptno 100  King  PRES  10 101  Kochher  VP  10 102  Scott  SALE  20 103  Allen  PROG  30 104  Bob  PROG  30 105  Joe  SE 106  Apel  10 dept表 deptno  dname 10  人事 20  営業 30  技術 40  研究 jobs表 JOBID  JNAME PRES  社長 VP  副社長 SALE  営業担当 PROG  プログラマ SE  システムエンジニア 出力結果 ENAME  DNAME  JNAME King  人事  社長 Kochher  人事  副社長 Scott  営業  営業担当 Allen  技術  プログラマ Bob  技術  プログラマ Joe    システムエンジニア Abel  人事 問題 3つの表を結合するとき正しいSQL文を選べ。 答え SELECT ename, dname, jname FROM emp e LEFT OUTHER JOIN dept d ON (e.deptno=d.deptno) LEFT OUTHER JOIN jobs j ON (e.jobid=j.deptno); どなたかご説明お願いします。