助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26861
問題を開く
外部結合の説明として正しいものはどれですか(該当するものを全て選択して下さい)。
正解
結合条件を満たす行と満たさない行の両方を取り出す
Oracle独自の結合構文には完全外部結合はない
解説
結合条件を満たしたデータのみを取り出すのではなく、検索条件を満たしていないデータも一緒に取り出す方法を外部結合といいます。
Oracle独自の結合構文では外部結合演算子(+)を使用して外部結合を行えますが、完全外部結合は行えません。
以上より、
・結合条件を満たす行と満たさない行の両方を取り出す
・Oracle独自の結合構文には完全外部結合はない
が正解となります。
その他の選択肢については以下のとおりです。
・結合条件を満たす行のみを取り出す
結合条件を満たす行のみを取り出す結合を内部結合といいます。
・結合条件を満たさない行のみを取り出す
外部結合では、結合条件を満たす行と満たさない行の両方を取り出します。
・NULL値を持たない列のみ結合できる
NULL値を持つ列を結合でき、結合条件を満たさない行も取り出せます。
Oracle独自の結合構文では外部結合演算子(+)を使用して外部結合を行えますが、完全外部結合は行えません。
以上より、
・結合条件を満たす行と満たさない行の両方を取り出す
・Oracle独自の結合構文には完全外部結合はない
が正解となります。
その他の選択肢については以下のとおりです。
・結合条件を満たす行のみを取り出す
結合条件を満たす行のみを取り出す結合を内部結合といいます。
・結合条件を満たさない行のみを取り出す
外部結合では、結合条件を満たす行と満たさない行の両方を取り出します。
・NULL値を持たない列のみ結合できる
NULL値を持つ列を結合でき、結合条件を満たさない行も取り出せます。
参考
結合条件を満たしたデータのみを取り出すのではなく、結合条件を満たしていないデータも一緒に取り出す方法を外部結合といいます(結合条件を満たすデータのみを取り出す方法を内部結合といいます)。
外部結合には、次の3つの方法があります。
SELECT [表接頭辞.]列名 [, [表接頭辞.]列名 ...]
FROM 表名1
{LEFT | RIGHT | FULL} [OUTER] JOIN 表名2
ON 結合条件 ;
左側外部結合は結合条件を満たすデータと、JOIN句の左側に指定された表のデータを全て取り出す結合です。
右側外部結合は結合条件を満たすデータと、JOIN句の右側に指定された表のデータを全て取り出す結合です。
完全外部結合はJOIN句の左右に指定された表のデータを条件を満たしていないデータも含めて全て取り出す結合です。
また、Oracle独自の結合構文で外部結合を行えます。その際は外部結合演算子(+)を使用します。
Oracle独自の外部結合構文は次のとおりです。
SELECT [表接頭辞.]列名 [, [表接頭辞.]列名 ...]
FROM 表名1, 表名2
WHERE [表接頭辞1.]列名[(+)] = [表接頭辞2.]列名[(+)]
[AND 結合条件以外の条件];
Oracle独自の結合構文での外部結合では、WHERE句に指定した条件の左側に(+)をつけると右側外部結合、右側につけると左側外部結合の結果と等しくなります。
なお、Oracle独自の結合構文での外部結合では、完全外部結合は行えません。WHERE句の条件の両方に(+)をつけるとエラーとなります。
完全外部結合には FULL [OUTER] JOINを使用します。
外部結合には、次の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;
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;
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;
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;
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;
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;
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は完全外部結合ではないのか
s
sarann
投稿日 2022/11/22
Oracleではfull outer joinにて完全外部結合が出来ると思っています。
問題ではOracle独自構文としての完全外部結合はないと記載がありますが、
もし解答が合っている場合、
何をもって独自構文とするのか知りたいです。
q
quensan
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
参照先のサイト、大変参考になりました。理解できました、ありがとうございます。