助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26931
問題を開く
自己結合の説明として正しいものはどれですか(2つ選択してください)。

正解

ON句に結合条件を指定する

表に対して必ず表別名を指定する

解説

1つの表に2つの表別名を指定し、1つの表を2つの表に見立てて結合することを自己結合といいます。
自己結合を行うには、次のように記述します。

 SELECT 表別名.列名 [,表別名.列名 ...]
 FROM 表名1 表別名1 JOIN 表名1 表別名2
  ON 表別名1.列名 = 表別名2.列名 ;

自己結合を行う場合は、表に対して必ず表別名を指定します。

以上より、
・ON句に結合条件を指定する
・表に対して必ず表別名を指定する
が正解です。

以下は実行例です。
従業員の氏名を持つEMPLOYEES表と、MANAGER_IDを持つEMPLOYEES表があると見立てて2つの表を結合して、従業員名とその上司の氏名を表示しています。


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


その他の選択肢については以下のとおりです。
・非等価結合を使用することはできない
非等価結合を使用できるため、誤りです。

・2つ以上の表を結合する
同一の表同士で結合するので、誤りです。

・結合条件を満たしていないデータは取り出せない
自己結合は結合条件を満たすデータのみを取り出す内部結合と、結合条件を満たしていないデータも取り出す外部結合もできます。よって誤りです。

以下は左側外部結合(結合条件を満たすデータと、JOIN句の左側に指定された表のデータを全て取り出す)の実行例です。上司のいない従業員のデータも取り出しています。

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

参考

1つの表に2つの表別名を指定し、1つの表を2つの表に見立てて結合することを自己結合といいます。
自己結合を行うには、次のように記述します。

 SELECT 表別名.列名 [,表別名.列名 ...]
 FROM 表名1 表別名1 JOIN 表名1 表別名2
  ON 表別名1.列名 = 表別名2.列名 ;

自己結合を行う場合は、表に対して必ず表別名を指定します。

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


また、Oracle独自の結合構文で自己結合を行うには、次のように記述します。

 SELECT 表別名.列名 [,表別名.列名 ...]
 FROM 表名1 表別名1, 表名1 表別名2
  WHERE 表別名1.列名 = 表別名2.列名 ;


 
SQLを表示
SELECT emp.employee_name, mgr.employee_name
FROM employees emp, employees mgr
WHERE emp.manager_id = mgr.employee_id;
上に戻る

自己結合にUSING句が使用できない理由

投稿日 2024/02/20

上記の問題にて、以下のような表記がありました。
・USING句に結合条件を指定する
USING句は同じ名前の列のみを結合することができます。自己結合の実行例のように結合列に表接頭辞(表別名)を使用できないので、誤りです。

しかし、実際に、以下のクエリを実行したところ、エラーが発生せず、正常に実行されました。
SELECT e1.employee_name, e2.employee_name FROM employees e1 JOIN employees e2 using(job_id)

自己結合においてUSING句が使用できない理由について、詳細をご教示いただけないでしょうか。
私はSQLに関する経験が浅く、現在PingTを通じて学習を始めたばかりです。
そのため、この分野における知識には不確かな部分があります。もし誤解がある場合は、適切な指摘をいただけますと幸いです。

2024/02/21 16:29

すでに実際に試されているとおり、自己結合の場合にUSING句を使用してもエラーにはなりませんよね。

・USING句に結合条件を指定する
USING句は同じ名前の列のみを結合することができます。自己結合の実行例のように結合列に表接頭辞(表別名)を使用できないので、誤りです。

おそらくこの解説文で言いたいのは、USING句を用いる場合で「結合条件としての結合列に表接頭辞(表別名)を使用できない」ということだと思いますが、自己結合のクエリでUSING句に結合条件を指定する(表接頭辞を含まない列名を指定する)こと自体は不可能ではないので、この問題の選択肢として「USING句に結合条件を指定する」が「正しくない」とは言えないですよね。問題の修正をお願いしたいところです。

SQL> SELECT emp.employee_name, mgr.employee_name FROM employees emp JOIN employees mgr USING(emp.manager_id);
SELECT emp.employee_name, mgr.employee_name FROM employees emp JOIN employees mgr USING(emp.manager_id)
                                                                                           *
行1でエラーが発生しました。:
ORA-01748: ここでは修飾された列名は使用できません。


コメント

s sekakuma3

2024/02/22 21:50

rink_rew さん、再度のご教示、ありがとうございます。 自己結合における USING 句の使用方法について理解できました。 丁寧に説明していただき、本当にありがとうございました。

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

スタッフからの返信

s staff_ishii

2024/02/22 14:31

sekakuma3 さん、rink_rew さん ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。

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