助け合いフォーラム
正解
ON句に結合条件を指定する
表に対して必ず表別名を指定する
解説
自己結合を行うには、次のように記述します。
SELECT 表別名.列名 [,表別名.列名 ...]
FROM 表名1 表別名1 JOIN 表名1 表別名2
ON 表別名1.列名 = 表別名2.列名 ;
自己結合を行う場合は、表に対して必ず表別名を指定します。
以上より、
・ON句に結合条件を指定する
・表に対して必ず表別名を指定する
が正解です。
以下は実行例です。
従業員の氏名を持つEMPLOYEES表と、MANAGER_IDを持つEMPLOYEES表があると見立てて2つの表を結合して、従業員名とその上司の氏名を表示しています。
FROM employees emp JOIN employees mgr
ON emp.manager_id = mgr.employee_id;
その他の選択肢については以下のとおりです。
・非等価結合を使用することはできない
非等価結合を使用できるため、誤りです。
・2つ以上の表を結合する
同一の表同士で結合するので、誤りです。
・結合条件を満たしていないデータは取り出せない
自己結合は結合条件を満たすデータのみを取り出す内部結合と、結合条件を満たしていないデータも取り出す外部結合もできます。よって誤りです。
以下は左側外部結合(結合条件を満たすデータと、JOIN句の左側に指定された表のデータを全て取り出す)の実行例です。上司のいない従業員のデータも取り出しています。
FROM employees emp LEFT OUTER JOIN employees mgr
ON emp.manager_id = mgr.employee_id;
参考
自己結合を行うには、次のように記述します。
SELECT 表別名.列名 [,表別名.列名 ...]
FROM 表名1 表別名1 JOIN 表名1 表別名2
ON 表別名1.列名 = 表別名2.列名 ;
自己結合を行う場合は、表に対して必ず表別名を指定します。
FROM employees emp JOIN employees mgr
ON emp.manager_id = mgr.employee_id;
また、Oracle独自の結合構文で自己結合を行うには、次のように記述します。
SELECT 表別名.列名 [,表別名.列名 ...]
FROM 表名1 表別名1, 表名1 表別名2
WHERE 表別名1.列名 = 表別名2.列名 ;
FROM employees emp, employees mgr
WHERE emp.manager_id = mgr.employee_id;
自己結合にUSING句が使用できない理由
上記の問題にて、以下のような表記がありました。
・USING句に結合条件を指定する
USING句は同じ名前の列のみを結合することができます。自己結合の実行例のように結合列に表接頭辞(表別名)を使用できないので、誤りです。
しかし、実際に、以下のクエリを実行したところ、エラーが発生せず、正常に実行されました。
SELECT e1.employee_name, e2.employee_name FROM employees e1 JOIN employees e2 using(job_id)
自己結合においてUSING句が使用できない理由について、詳細をご教示いただけないでしょうか。
私はSQLに関する経験が浅く、現在PingTを通じて学習を始めたばかりです。
そのため、この分野における知識には不確かな部分があります。もし誤解がある場合は、適切な指摘をいただけますと幸いです。
すでに実際に試されているとおり、自己結合の場合に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 句の使用方法について理解できました。 丁寧に説明していただき、本当にありがとうございました。