助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26702
問題を開く
DEPARTMENTS表とEMPLOYEES表の構造を確認して下さい。





次のSQL文のうち、正しく実行されるものはどれですか。

正解

SELECT department_name, employee_name FROM departments JOIN employees USING (department_id);

解説

USING句を指定した結合では、結合列に表接頭辞を使用できません。また、NATURAL JOIN句と同時に指定することもできません。

以上より、
・SELECT department_name, employee_name FROM departments JOIN employees USING (department_id);
が正解となります。

正解のSQL文の実行結果は次のようになります。



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

・SELECT department_name, employee_name FROM departments NATURAL JOIN employees USING (department_id);
USING句を指定した結合では、NATURAL JOIN句とUSING句を1つの結合で同時に指定することはできません。

・SELECT department_name, employee_name FROM departments d JOIN employees e USING (d.department_id);
・SELECT d.department_id, e.employee_name FROM departments d JOIN employees e USING(department_id);
USING句を指定した結合では、結合列に表接頭辞を使用できません。

参考

USING句を使用した結合は、等価結合の1つで、結合列を明示的に指定できます。
USING句に指定できる列は2つの表で同名の列です。自然結合では、同名でデータ型が異なる列を結合するとエラーとなりますが、USING句を使用して結合列を制限することで、エラーを避ける事ができます。
構文は以下の通りです。

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

 
 
SQLを表示
DESC departments;

DESC employees;

SELECT departments.department_name, employees.employee_name
FROM departments JOIN employees
 USING (department_id);


USING句を使用した表の結合では、結合列を明示的に指定できるので、2つの表に共通して存在する列が2つ以上ある場合でも、特定の行だけを結合列として指定できます。


 
SQLを表示
SELECT department_id, department_name
FROM departments;

SELECT department_id, department_name
FROM departments3;



 
SQLを表示
DESC departments3;

SELECT department_id, department_name
FROM departments
 NATURAL JOIN departments3;

SELECT department_id, departments.department_name
FROM departments
 JOIN departments3 USING (department_id);


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


 
SQLを表示
SELECT departments.department_id, employees.employee_id
FROM departments
 JOIN employees USING (department_id);


なお、1つの結合でNATURAL JOIN句とUSING句を1つの結合で同時に指定できません。同時に指定するとエラーとなります。


 
SQLを表示
SELECT department_id, employees.employee_id
FROM departments
 NATURAL JOIN employees USING (department_id);
上に戻る

解説は正しいですか?

投稿日 2025/04/09

解説

  1. SELECT department_name, employee_name FROM departments d JOIN employees e USING (d.department_id);
  2. SELECT d.department_id, e.employee_name FROM departments d JOIN employees e USING(department_id);
    USING句を指定した結合では、結合列に表接頭辞を使用できません。

上の解説は1の解説で、2は表接頭辞を使用することはできないが、表接頭辞を使用していないためどちらの表の列か判別できない。故に不正解という認識で良いですか?

2025/04/10 17:44

2は、USINGの結合列としてdepartment_idが指定されていて、結合列に別名がついている(SELECT d.department_id ~~~~の d.department_id の部分)という話ですかね。
日本語の問題とも言えるかもしれませんが、解説の「USING句を指定した結合では、結合列に表接頭辞を使用できません。」はどちらのケースも説明できている、と言えないこともないかなと思いました。

SQL> SELECT d.department_id, e.employee_name FROM departments d JOIN employees e USING(department_id);
SELECT d.department_id, e.employee_name FROM departments d JOIN employees e USING(department_id)
       *
行1でエラーが発生しました。:
ORA-25154: USING句の列の部分には修飾子を持てません。


SQL> SELECT department_id, e.employee_name FROM departments d JOIN employees e USING(department_id);

DEPARTMENT_ID EMPLOYEE_NAME
------------- ------------------------------
            1 山田二郎
            2 佐藤昭夫
            3 山口洋子
            4 田中浩介
            5 加藤昭彦
            1 佐々木明子
            1 菊池浩二
            1 中山大輔
            2 星野健一
            3 斎藤京子
            4 吉田亜希

DEPARTMENT_ID EMPLOYEE_NAME
------------- ------------------------------
            5 阿部伊吹
            1 米村真司
            2 伊藤佳奈
            3 橋本淳
            4 井上悦子
            5 渡辺和也
            1 塚本孝
            1 野口圭子
            1 内田雄介
            1 高田明
            1 坂本真

22行が選択されました。

SQL> 


コメント

S Shibai_Oracle

2025/04/11 17:23

勉強になりました。ありがとうございます。

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

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