助け合いフォーラム
正解
結合する2つの表に同じ列名でデータ型の異なる列がある場合
結合する2つの表の一部の列を結合列として使用する場合
解説
以上より、
・結合する2つの表に同じ列名でデータ型の異なる列がある場合
・結合する2つの表の一部の列を結合列として使用する場合
が正解となります。
その他の選択肢については次のとおりです。
・非等価結合を行う場合
USING句を使用した結合は等価結合となります。
・結合列の値が一方の表にしか存在しない場合
外部結合を行います。
・デカルト積を戻す結合を行う場合
CROSS結合を行います。
参考
USING句に指定できる列は2つの表で同名の列です。自然結合では、同名でデータ型が異なる列を結合するとエラーとなりますが、USING句を使用して結合列を制限することで、エラーを避ける事ができます。
構文は以下の通りです。
SELECT [表接頭辞.]列名 [, [表接頭辞.]列名 ...]
FROM 表名1 JOIN 表名2 USING (列名 [,列名...])
[WHERE ...];

DESC employees;
SELECT departments.department_name, employees.employee_name
FROM departments JOIN employees
USING (department_id);
USING句を使用した表の結合では、結合列を明示的に指定できるので、2つの表に共通して存在する列が2つ以上ある場合でも、特定の行だけを結合列として指定できます。

FROM departments;
SELECT department_id, department_name
FROM 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句を使用した表の結合では結合列に表接頭辞を使用できません。表接頭辞を指定するとエラーとなります。

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

FROM departments
NATURAL JOIN employees USING (department_id);
この問題の解答間違っていないか?
以下、Chatgptの回答。
デカルト積を戻す結合を行う場合 ❌ 誤り
デカルト積(CROSS JOIN)とは異なり、USING は共通列での等価結合を行う。
② 結合する2つの表の一部の列を結合列として使用する場合 ✅ 正しい
USING(列名) で指定した列のみを結合に使用できる。
③結合する2つの表に同じ列名でデータ型の異なる列がある場合 ❌ 誤り
USING は両方のテーブルで同じデータ型の列が必要。データ型が異なるとエラーになる。
※pint-Tでは正解になっているが、解説もUSING句を使用しないことでエラー回避ができるという旨となっており、USING句を使用する選択肢として破綻している。
④非等価結合を行う場合 ❌ 誤り
USING 句は等価結合(=ON A.col = B.col)のみ対応。> や < のような非等価結合はON句を使用する。
⑤結合列の値が一方の表にしか存在しない場合 ✅ 正しい
LEFT OUTER JOIN ... USING(列名) のように使うことで、片方のテーブルにしかない値もNULLとして扱える。
SQLを業務で使用していますが、細かい点では理解できておりません。
ご存知の方お答えいただけると幸いです。
解説もUSING句を使用しないことでエラー回避ができるという旨となっており、USING句を使用する選択肢として破綻している。
あれ?解説は
同名でデータ型の異なる列がある場合に、USING句で結合列に指定しないことで、エラーを回避できます
だから、「USING 句を使用しない」ではなく「USING 句を使って、データ型の異なる列を結合列に指定しない」ですよね?
ChatGPT にどのように質問したのかがわからないのでプロンプトに合わせた回答を返している可能性もありますが、少なくとも同問題の解説で AI Assistant に聞いてみたら選択肢の正誤は同じでしたよ。
ちなみに、ご提示の ChatGPT の回答
USING は両方のテーブルで同じデータ型の列が必要。データ型が異なるとエラーになる。
ですが、これは正しいです。そして解説も「同じ名前で異なるデータ型」の列を USING で指定しないことでエラーを回避できる という話です。
ChatGPT くんが、何を問われているかや利用シーンを正しく理解せずに正誤判断してるとしか思えないですけどね。(「どのような場合にUSING句を使用しますか」ではなく「どのような場合に USING 句が使えるか」と誤読してるんじゃないかというレベル)
コメント
横から失礼します。
ChatGPTの回答云々は一旦おいておいて、単純に本設問を確認してみました。
- 結合しようとしている2つの表がある。
- それぞれの表に、同名の列が2つある。
- 同名の列2つのうち、1つは型も一致、もう1つは型が異なる。
このような状況だと仮定して、回答の選択肢と解説をみると、
- 結合する2つの表の一部の列を結合列として使用する場合
USING句で結合列を指定することで、同名の列が複数ある場合に一部の列だけを結合列として使用できる。
USING句を使用するケースとして適切。
- 結合する2つの表に同じ列名でデータ型の異なる列がある場合
USING句で「同名だが型が異なる列ではない、もう一方の同名の列」を結合列として指定することで、エラーなく結合できる。
※ 前述の#1のケースと意図は同じようなもので、同名の列が複数ある場合にそのうちいずれか1つを指定して、他の同名の列は結合に使用しないというもの。
ちなみに、ChatGPTの回答で正答とされている「結合列の値が一方の表にしか存在しない場合」ですが、これは解説にもある通り「USING句」云々というより「外部結合」の特徴・用途と考える方が妥当かなと思いました。(もちろん外部結合の中でUSING句を使うことはできますが、「結合列の値が一方の表にしか存在しない場合」と「USING句」は試験問題として出題されてきたら、私個人的には話として直接繋がらない印象です)
私の理解がずれているかもしれません。的外れなコメントとなっていたらすみません。
コメント
この投稿に対して返信しませんか?
k kota0706
2025/03/09 07:25
早々のご回答とてもありがたいです。 当方としては、設問の「どのような場合にUSING句を使用しますか(該当するものを2つ選択して下さい)。」で、「結合する2つの表に同じ列名でデータ型の異なる列がある場合」の選択肢が正にならないのではと以前感じます。 当方の質問文が悪く誤解を招いたかもしれませんが、解説の内容に質問したのではなく、正解の選択肢について質問させていただきました。