助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26861
問題を開く
外部結合の説明として正しいものはどれですか(該当するものを全て選択して下さい)。

正解

結合条件を満たす行と満たさない行の両方を取り出す

Oracle独自の結合構文には完全外部結合はない

解説

結合条件を満たしたデータのみを取り出すのではなく、検索条件を満たしていないデータも一緒に取り出す方法を外部結合といいます。
Oracle独自の結合構文では外部結合演算子(+)を使用して外部結合を行えますが、完全外部結合は行えません。

以上より、
・結合条件を満たす行と満たさない行の両方を取り出す
・Oracle独自の結合構文には完全外部結合はない
が正解となります。

その他の選択肢については以下のとおりです。

・結合条件を満たす行のみを取り出す
結合条件を満たす行のみを取り出す結合を内部結合といいます。

・結合条件を満たさない行のみを取り出す
外部結合では、結合条件を満たす行と満たさない行の両方を取り出します。

・NULL値を持たない列のみ結合できる
NULL値を持つ列を結合でき、結合条件を満たさない行も取り出せます。

参考

結合条件を満たしたデータのみを取り出すのではなく、結合条件を満たしていないデータも一緒に取り出す方法を外部結合といいます(結合条件を満たすデータのみを取り出す方法を内部結合といいます)。

外部結合には、次の3つの方法があります。



 SELECT [表接頭辞.]列名 [, [表接頭辞.]列名 ...]
 FROM 表名1
  {LEFT | RIGHT | FULL} [OUTER] JOIN 表名2
  ON 結合条件 ;

左側外部結合は結合条件を満たすデータと、JOIN句の左側に指定された表のデータを全て取り出す結合です。


 
SQLを表示
SELECT emp.employee_name, mgr.employee_name
FROM employees emp LEFT OUTER JOIN employees mgr
 ON emp.manager_id = mgr.employee_id;


右側外部結合は結合条件を満たすデータと、JOIN句の右側に指定された表のデータを全て取り出す結合です。


 
SQLを表示
SELECT e.employee_name, j.job_name
FROM employees e RIGHT OUTER JOIN jobs j
 ON e.job_id = j.job_id;


完全外部結合はJOIN句の左右に指定された表のデータを条件を満たしていないデータも含めて全て取り出す結合です。


 
SQLを表示
SELECT emp.employee_name, mgr.employee_name
FROM employees emp FULL OUTER JOIN employees mgr
 ON emp.manager_id = mgr.employee_id;


また、Oracle独自の結合構文で外部結合を行えます。その際は外部結合演算子(+)を使用します。
Oracle独自の外部結合構文は次のとおりです。

 SELECT [表接頭辞.]列名 [, [表接頭辞.]列名 ...]
 FROM 表名1, 表名2
 WHERE [表接頭辞1.]列名[(+)] = [表接頭辞2.]列名[(+)]
 [AND 結合条件以外の条件];

Oracle独自の結合構文での外部結合では、WHERE句に指定した条件の左側に(+)をつけると右側外部結合、右側につけると左側外部結合の結果と等しくなります。


 
SQLを表示
SELECT p.category, p.name, o.name
FROM prod p, oldprod o
WHERE p.category(+) = o.category;

SELECT p.category, p.name, o.name
FROM prod p RIGHT OUTER JOIN oldprod o
 ON p.category = o.category;



 
SQLを表示
SELECT p.category, p.name, o.name
FROM prod p, oldprod o
WHERE p.category = o.category(+);

SELECT p.category, p.name, o.name
FROM prod p LEFT OUTER JOIN oldprod o
 ON p.category = o.category;


なお、Oracle独自の結合構文での外部結合では、完全外部結合は行えません。WHERE句の条件の両方に(+)をつけるとエラーとなります。
完全外部結合には FULL [OUTER] JOINを使用します。


 
SQLを表示
SELECT p.category, p.name, o.name
FROM prod p, oldprod o
WHERE p.category(+) = o.category(+);

SELECT p.category, p.name, o.name
FROM prod p FULL OUTER JOIN oldprod o
 ON p.category = o.category;
上に戻る

Full outer joinは完全外部結合ではないのか

投稿日 2022/11/22

Oracleではfull outer joinにて完全外部結合が出来ると思っています。
問題ではOracle独自構文としての完全外部結合はないと記載がありますが、
もし解答が合っている場合、
何をもって独自構文とするのか知りたいです。

2022/11/24 12:26

FULL OUTER JOINはANSI SQLの構文で、Oracle独自構文は外部結合演算子(+)を使う構文です。
26861の参考や26932、下記のサイトがわかりやすいかもしれません。

https://blogs.oracle.com/oraclemaster/post/om-silver-sql-2019-seminar-13
Oracle構文による結合


コメント

s sarann

2022/12/25 20:46

参照先のサイト、大変参考になりました。理解できました、ありがとうございます。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?