以下の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.1
- 回答日時:
結果は違うと思います。
大きく違うのは、emp e表のe.deptnoがNULLとなっている行が含まれるか
含まれないか。
LEFT OUTER JOINは、左側のテーブルの行はすべて含まれますが右側のテーブルの行は左側のテーブルにマッチするものがなければ表示されません。
RIGHT OUTER JOINは逆になりますので、結果は異なります。
この回答への補足
回答ありがとうございます!
やはり違いますよね
長いので貼り付けようか迷いましたが・・・
下記の問題がどうしても分かりません。
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);
どなたかご説明お願いします。
すみません。この問題の回答の補足には
全ての従業員を表示するため、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を全て表示となる気がするのですが。。
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です。
>どちらが主になるテーブルかが分かりにくくなるので、一般的にはRIGHT OUTER JOINは使わないようします。
(RIGHT OUTER JOINはすべてLEFT OUTER JOINを使った文に書き換えることが可能です)
勉強になりました。どうもありがとうございました。
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の可能性があり
結合条件として成立しないかもしれませんけどね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- PostgreSQL SQLで検索結果の記事を表示したい 1 2022/04/28 21:03
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle SQL update方法 2 2022/06/22 14:07
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL 外部結合についての質問
-
関係演算子が無効です。
-
エラー「無効な識別子です」
-
Oracle SQL 結合の手法について
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
Accessで別テーブルの値をフォ...
-
SELECTで1件のみ取得するには?
-
select insertで複数テーブルか...
-
カレントレコードが無い事を判...
-
Excelでセルの書式設定を使用し...
-
Date型にNULLをセットしたい V...
-
データセットのレコード更新が...
-
select句副問い合わせ 値の個...
-
SQL文で右から1文字だけ削除す...
-
ADO VBA 実行時エラー3021
-
SELECTの結果で同一行を複数回...
-
Accessでのレコード存在チェック
-
エクスプローラーで「2つの条件...
-
弥生販売08 得意先分類1の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL 外部結合についての質問
-
自己相関サブクエリと自己結合...
-
エラー2「無効な識別子です」
-
2つのSQL(Access)の結果[時刻,...
-
関係演算子が無効です。
-
同じテーブルをLEFT JOIN
-
SQLで後方の文字列を置換する方法
-
エラー「無効な識別子です」
-
LEFT JOINの条件式で=’’を使用...
-
Excel VBAで、Averageの範囲を...
-
エクセルVBAでSUM関数の位置を...
-
GROUP BYを行った後に結合した...
-
Accessで別テーブルの値をフォ...
-
Oracleでの文字列連結サイズの上限
-
SELECTで1件のみ取得するには?
-
SQL文で右から1文字だけ削除す...
-
GROUP BYを使ったSELECT文の総...
-
select句副問い合わせ 値の個...
-
レコードが存在しなかった場合
-
ADO VBA 実行時エラー3021
おすすめ情報