助け合いフォーラム
正解
ON句に結合条件を指定する
表に対して必ず表別名を指定する
解説
自己結合を行うには、次のように記述します。
SELECT 表別名.列名 [,表別名.列名 ...]
FROM 表名1 表別名1 JOIN 表名1 表別名2
ON 表別名1.列名 = 表別名2.列名 ;
自己結合を行う場合は、表に対して必ず表別名を指定します。
以上より、
・ON句に結合条件を指定する
・表に対して必ず表別名を指定する
が正解です。
以下は実行例です。
従業員の氏名を持つEMPLOYEES表と、MANAGER_IDを持つEMPLOYEES表があると見立てて2つの表を結合して、従業員名とその上司の氏名を表示しています。
![<img src="/mondai3/img/jpg/kk49002.jpg">](https://ping-t-production-strg.s3.ap-northeast-1.amazonaws.com/uploads/question_image/file/19593/kk49002.jpg?X-Amz-Expires=600&X-Amz-Date=20240726T234043Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAcaDmFwLW5vcnRoZWFzdC0xIkgwRgIhAJ7mkC5JfvSdLioYGKPvL4LNMvPwvSDw5e6Trr2wGIteAiEA3PTHM4A2nrwe%2FsKtasucFN4M2bX8SdlW8y7dOzQ7puAqsQQI4P%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2MjM0Mjk4MjcyNzUiDCdr3QPeyekWGLgFlSqFBKpCSz3SbveHUOGK2zeHLuVO2cItM42HqGJgxnLQS8wor%2BLtL3EVqtpbI8I26UG8TqsQ8ROdervHWNtEF2b0YDJeJ9OA1lTqIYRGfXT%2F0vga3BjTreZymRtCJxCBhuiBlLx6LQiOAsHh%2FqccRNGloBAcTGOzTHzFySnilRiwHeUfF7A5ENm3WS77BOMgNIZfQ%2BqOl8DiCoR%2F4pFqTREpbE2newnXyJLC2naNMvWg1VqNXBmsUkeGPKModBV7IXhjp1KuIo9uTCVLHTNNGeQ4QqJXaMCzwY2TCu7f5A%2B2AI9RzVu2xa8dHndhkOWtL3p4ayYMuYoNaeoGWRjuvKAfvdYlpLmHd%2BI8qb%2FC3r%2B5QEGEwE6pzDvX9RBseNeDx8xV0oY3WH47HS2TwZrFSsSIXfbkWRUtqnwGPsh6HHGcZ%2BttEmkB0id8owV%2F%2BkDcKcBkVSnEZ14UIczdWOipIytNI88HHsMahQhW0FL%2FV8DANDrF%2B0iLCjVNlTQpqDd0TBecXiGaUeXwyxJJtZBty4IzeiiGodEmdZvMXRG5J8BWMG5rjxSe2gTe%2BZWtFkw9B0DCFxZM%2Bz2LeV%2BDRXD0Ztn4Rjqo4pKn1IJTo2XPksV3q%2FS25FfXPCV%2BgYiqfEWMhZEBnMMp%2FlJQQ9O5lQWu%2FO3Rpbv0WmlwCYOqfaxafD26T5iJNCIiFkcw0N6QtQY6pQHbqvxSzEhMcFvQGQ8HD8a0AHu3DdZP%2FFuA131Jli24oxUqgn74dE0s2tjZNl10mAmXJ5spI8Xq5uL5E8yYKCD3dkwfq5sjHkAWdViw1VYA64tvvmrYdURs3iermXNq44RnmgovPmGbpOgB4SNjrt6dNp7tl00mC8JEZu%2BNsrX97GRXuPviHi2WTlfk2%2FmfdOlDwvz8NsaG50T63jElW1sev%2BBZ0UU%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAZCJ2QHLF74BLTX7P%2F20240726%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=b4b5470dca6e63e37bd25bc4c0a5af6706cb296b61547bec283f50f3bbaa8ecd)
FROM employees emp JOIN employees mgr
ON emp.manager_id = mgr.employee_id;
その他の選択肢については以下のとおりです。
・非等価結合を使用することはできない
非等価結合を使用できるため、誤りです。
・2つ以上の表を結合する
同一の表同士で結合するので、誤りです。
・結合条件を満たしていないデータは取り出せない
自己結合は結合条件を満たすデータのみを取り出す内部結合と、結合条件を満たしていないデータも取り出す外部結合もできます。よって誤りです。
以下は左側外部結合(結合条件を満たすデータと、JOIN句の左側に指定された表のデータを全て取り出す)の実行例です。上司のいない従業員のデータも取り出しています。
![<img src="/mondai3/img/jpg/kk49003.jpg">](https://ping-t-production-strg.s3.ap-northeast-1.amazonaws.com/uploads/question_image/file/19597/kk49003.jpg?X-Amz-Expires=600&X-Amz-Date=20240726T234043Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAcaDmFwLW5vcnRoZWFzdC0xIkgwRgIhAJ7mkC5JfvSdLioYGKPvL4LNMvPwvSDw5e6Trr2wGIteAiEA3PTHM4A2nrwe%2FsKtasucFN4M2bX8SdlW8y7dOzQ7puAqsQQI4P%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2MjM0Mjk4MjcyNzUiDCdr3QPeyekWGLgFlSqFBKpCSz3SbveHUOGK2zeHLuVO2cItM42HqGJgxnLQS8wor%2BLtL3EVqtpbI8I26UG8TqsQ8ROdervHWNtEF2b0YDJeJ9OA1lTqIYRGfXT%2F0vga3BjTreZymRtCJxCBhuiBlLx6LQiOAsHh%2FqccRNGloBAcTGOzTHzFySnilRiwHeUfF7A5ENm3WS77BOMgNIZfQ%2BqOl8DiCoR%2F4pFqTREpbE2newnXyJLC2naNMvWg1VqNXBmsUkeGPKModBV7IXhjp1KuIo9uTCVLHTNNGeQ4QqJXaMCzwY2TCu7f5A%2B2AI9RzVu2xa8dHndhkOWtL3p4ayYMuYoNaeoGWRjuvKAfvdYlpLmHd%2BI8qb%2FC3r%2B5QEGEwE6pzDvX9RBseNeDx8xV0oY3WH47HS2TwZrFSsSIXfbkWRUtqnwGPsh6HHGcZ%2BttEmkB0id8owV%2F%2BkDcKcBkVSnEZ14UIczdWOipIytNI88HHsMahQhW0FL%2FV8DANDrF%2B0iLCjVNlTQpqDd0TBecXiGaUeXwyxJJtZBty4IzeiiGodEmdZvMXRG5J8BWMG5rjxSe2gTe%2BZWtFkw9B0DCFxZM%2Bz2LeV%2BDRXD0Ztn4Rjqo4pKn1IJTo2XPksV3q%2FS25FfXPCV%2BgYiqfEWMhZEBnMMp%2FlJQQ9O5lQWu%2FO3Rpbv0WmlwCYOqfaxafD26T5iJNCIiFkcw0N6QtQY6pQHbqvxSzEhMcFvQGQ8HD8a0AHu3DdZP%2FFuA131Jli24oxUqgn74dE0s2tjZNl10mAmXJ5spI8Xq5uL5E8yYKCD3dkwfq5sjHkAWdViw1VYA64tvvmrYdURs3iermXNq44RnmgovPmGbpOgB4SNjrt6dNp7tl00mC8JEZu%2BNsrX97GRXuPviHi2WTlfk2%2FmfdOlDwvz8NsaG50T63jElW1sev%2BBZ0UU%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAZCJ2QHLF74BLTX7P%2F20240726%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=5362ba8da10af43424f75b968b83c775df6817545db26dc4fdc7870cf9b8d30b)
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.列名 ;
自己結合を行う場合は、表に対して必ず表別名を指定します。
![【図を表示2】](https://ping-t-production-strg.s3.ap-northeast-1.amazonaws.com/uploads/question_image/file/19593/kk49002.jpg?X-Amz-Expires=600&X-Amz-Date=20240726T234043Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAcaDmFwLW5vcnRoZWFzdC0xIkgwRgIhAJ7mkC5JfvSdLioYGKPvL4LNMvPwvSDw5e6Trr2wGIteAiEA3PTHM4A2nrwe%2FsKtasucFN4M2bX8SdlW8y7dOzQ7puAqsQQI4P%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2MjM0Mjk4MjcyNzUiDCdr3QPeyekWGLgFlSqFBKpCSz3SbveHUOGK2zeHLuVO2cItM42HqGJgxnLQS8wor%2BLtL3EVqtpbI8I26UG8TqsQ8ROdervHWNtEF2b0YDJeJ9OA1lTqIYRGfXT%2F0vga3BjTreZymRtCJxCBhuiBlLx6LQiOAsHh%2FqccRNGloBAcTGOzTHzFySnilRiwHeUfF7A5ENm3WS77BOMgNIZfQ%2BqOl8DiCoR%2F4pFqTREpbE2newnXyJLC2naNMvWg1VqNXBmsUkeGPKModBV7IXhjp1KuIo9uTCVLHTNNGeQ4QqJXaMCzwY2TCu7f5A%2B2AI9RzVu2xa8dHndhkOWtL3p4ayYMuYoNaeoGWRjuvKAfvdYlpLmHd%2BI8qb%2FC3r%2B5QEGEwE6pzDvX9RBseNeDx8xV0oY3WH47HS2TwZrFSsSIXfbkWRUtqnwGPsh6HHGcZ%2BttEmkB0id8owV%2F%2BkDcKcBkVSnEZ14UIczdWOipIytNI88HHsMahQhW0FL%2FV8DANDrF%2B0iLCjVNlTQpqDd0TBecXiGaUeXwyxJJtZBty4IzeiiGodEmdZvMXRG5J8BWMG5rjxSe2gTe%2BZWtFkw9B0DCFxZM%2Bz2LeV%2BDRXD0Ztn4Rjqo4pKn1IJTo2XPksV3q%2FS25FfXPCV%2BgYiqfEWMhZEBnMMp%2FlJQQ9O5lQWu%2FO3Rpbv0WmlwCYOqfaxafD26T5iJNCIiFkcw0N6QtQY6pQHbqvxSzEhMcFvQGQ8HD8a0AHu3DdZP%2FFuA131Jli24oxUqgn74dE0s2tjZNl10mAmXJ5spI8Xq5uL5E8yYKCD3dkwfq5sjHkAWdViw1VYA64tvvmrYdURs3iermXNq44RnmgovPmGbpOgB4SNjrt6dNp7tl00mC8JEZu%2BNsrX97GRXuPviHi2WTlfk2%2FmfdOlDwvz8NsaG50T63jElW1sev%2BBZ0UU%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAZCJ2QHLF74BLTX7P%2F20240726%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=b4b5470dca6e63e37bd25bc4c0a5af6706cb296b61547bec283f50f3bbaa8ecd)
FROM employees emp JOIN employees mgr
ON emp.manager_id = mgr.employee_id;
また、Oracle独自の結合構文で自己結合を行うには、次のように記述します。
SELECT 表別名.列名 [,表別名.列名 ...]
FROM 表名1 表別名1, 表名1 表別名2
WHERE 表別名1.列名 = 表別名2.列名 ;
![【図を表示】](https://ping-t-production-strg.s3.ap-northeast-1.amazonaws.com/uploads/question_image/file/19592/k49002.jpg?X-Amz-Expires=600&X-Amz-Date=20240726T234043Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAcaDmFwLW5vcnRoZWFzdC0xIkgwRgIhAJ7mkC5JfvSdLioYGKPvL4LNMvPwvSDw5e6Trr2wGIteAiEA3PTHM4A2nrwe%2FsKtasucFN4M2bX8SdlW8y7dOzQ7puAqsQQI4P%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2MjM0Mjk4MjcyNzUiDCdr3QPeyekWGLgFlSqFBKpCSz3SbveHUOGK2zeHLuVO2cItM42HqGJgxnLQS8wor%2BLtL3EVqtpbI8I26UG8TqsQ8ROdervHWNtEF2b0YDJeJ9OA1lTqIYRGfXT%2F0vga3BjTreZymRtCJxCBhuiBlLx6LQiOAsHh%2FqccRNGloBAcTGOzTHzFySnilRiwHeUfF7A5ENm3WS77BOMgNIZfQ%2BqOl8DiCoR%2F4pFqTREpbE2newnXyJLC2naNMvWg1VqNXBmsUkeGPKModBV7IXhjp1KuIo9uTCVLHTNNGeQ4QqJXaMCzwY2TCu7f5A%2B2AI9RzVu2xa8dHndhkOWtL3p4ayYMuYoNaeoGWRjuvKAfvdYlpLmHd%2BI8qb%2FC3r%2B5QEGEwE6pzDvX9RBseNeDx8xV0oY3WH47HS2TwZrFSsSIXfbkWRUtqnwGPsh6HHGcZ%2BttEmkB0id8owV%2F%2BkDcKcBkVSnEZ14UIczdWOipIytNI88HHsMahQhW0FL%2FV8DANDrF%2B0iLCjVNlTQpqDd0TBecXiGaUeXwyxJJtZBty4IzeiiGodEmdZvMXRG5J8BWMG5rjxSe2gTe%2BZWtFkw9B0DCFxZM%2Bz2LeV%2BDRXD0Ztn4Rjqo4pKn1IJTo2XPksV3q%2FS25FfXPCV%2BgYiqfEWMhZEBnMMp%2FlJQQ9O5lQWu%2FO3Rpbv0WmlwCYOqfaxafD26T5iJNCIiFkcw0N6QtQY6pQHbqvxSzEhMcFvQGQ8HD8a0AHu3DdZP%2FFuA131Jli24oxUqgn74dE0s2tjZNl10mAmXJ5spI8Xq5uL5E8yYKCD3dkwfq5sjHkAWdViw1VYA64tvvmrYdURs3iermXNq44RnmgovPmGbpOgB4SNjrt6dNp7tl00mC8JEZu%2BNsrX97GRXuPviHi2WTlfk2%2FmfdOlDwvz8NsaG50T63jElW1sev%2BBZ0UU%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAZCJ2QHLF74BLTX7P%2F20240726%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=45169ee2204b9003708471e4ef8254aef4e4bc971f482858e3887c585a867726)
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 句の使用方法について理解できました。 丁寧に説明していただき、本当にありがとうございました。