助け合いフォーラム

Oracle DB

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

正解

2つの表に共通して存在する列に基づいて結合を行う

同名かつ同じデータ型の列で結合する場合に使用する

結合列に表接頭辞を使用することはできない

解説

自然結合では、2つの表に共通して存在する同名で同じデータ型(または互換性のあるデータ型)の列に基づいて、表を結合します。
そのため、結合条件を指定する必要はありません。また、2つの表に同名で同じデータ型の列が複数ある場合はその組合せで結合します。
なお、自然結合の結合列には表接頭辞を使用することができません。表接頭辞を指定するとエラーとなります。

以上より、
・2つの表に共通して存在する列に基づいて結合を行う
・同名かつ同じデータ型の列で結合する場合に使用する
・結合列に表接頭辞を使用することはできない
が正解となります。

参考

自然結合では、2つの表に共通して存在する同名で同じデータ型(または互換性のあるデータ型)の列に基づいて、表を結合します。
構文は以下の通りです。

 SELECT [表接頭辞.]列名 [, [表接頭辞.]列名 ...]
 FROM 表名1 NATURAL JOIN 表名2
 [WHERE ...];

 
 
SQLを表示
DESC departments;

DESC employees;

SELECT departments.department_name, employees.employee_name
FROM departments NATURAL JOIN employees;


自然結合では、結合する列が自動的に判断されるため、明示的に結合条件を指定する必要がありません、また、2つの表に同名で異なるデータ型の列がある場合、自然結合を行うとエラーとなります。
※ データ型が異なる場合でも、Oracleの暗黙的なデータ型変換が可能な場合にはエラーなく実行できます。暗黙的なデータ型変換については、分野「変換関数及び条件式」を参照してください。


 
SQLを表示
DESC departments2;

SELECT department_name
FROM departments NATURAL JOIN departments2;


同名で同じデータ型(または互換性のあるデータ型)の列が2つ以上ある場合には、全ての共通する列が結合条件として使用されます。いずれか1つの列を結合列として指定することはできません。


 
SQLを表示
DESC departments3;

DESC employees;

SELECT department_id, employee_id
FROM departments3;

SELECT department_id, employee_id
FROM employees;

SELECT department_id, department_name, employee_id, employee_name
FROM departments3 NATURAL JOIN employees;


また、自然結合の結合列には表接頭辞を使用することができません。表接頭辞を指定するとエラーとなります。


 
SQLを表示
SELECT departments.department_id, employees.employee_name
FROM departments NATURAL JOIN employees;



 
SQLを表示
SELECT department_id, employees.employee_name
FROM departments NATURAL JOIN employees;
上に戻る

データ型の異なる同名の列がある場合はエラーとなる

投稿日 2025/07/31

「データ型の異なる同名の列がある場合はエラーとなる」

CREATE TABLE TEST1(
COL1 NUMBER(1)
);

CREATE TABLE TEST1(
COL1 CHAR(1)
);

でSELECT * FROM TEST1 NATURAL JOIN TEST2;

で正常実行できたので、この記載は間違いじゃないでしょうか。
TEST1に1
TEST2に'1'
を格納すると正しく動き、
TEST1に1
TEST2に'a'
を格納するとエラーになります。

同名でデータが異なっても暗黙的変換できる形であれば結合可能ではないのですか?

スタッフからの返信

s staff_ishii

2025/08/05 18:09

junext25 さん、 ご指摘の点について、加筆、修正を行いました。 ご報告、誠にありがとうございました。

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