助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26703
問題を開く
どのような場合にUSING句を使用しますか(該当するものを2つ選択して下さい)。

正解

結合する2つの表に同じ列名でデータ型の異なる列がある場合

結合する2つの表の一部の列を結合列として使用する場合

解説

USING句を使用した結合は、等価結合の1つで、結合列を明示的に指定することができるので、2つの表に同名の列が複数あり、その一部を結合列にしたい場合や、同名でデータ型の異なる列がある場合に、USING句で結合列に指定しないことで、エラーを回避できます(自然結合では、同名でデータ型が異なる列を結合してしまいエラーとなります)。

以上より、
・結合する2つの表に同じ列名でデータ型の異なる列がある場合
・結合する2つの表の一部の列を結合列として使用する場合
が正解となります。

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

・非等価結合を行う場合
USING句を使用した結合は等価結合となります。

・結合列の値が一方の表にしか存在しない場合
外部結合を行います。

・デカルト積を戻す結合を行う場合
CROSS結合を行います。

参考

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/03/08

以下、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を業務で使用していますが、細かい点では理解できておりません。
ご存知の方お答えいただけると幸いです。

2025/03/08 11:31

解説もUSING句を使用しないことでエラー回避ができるという旨となっており、USING句を使用する選択肢として破綻している。

あれ?解説は

同名でデータ型の異なる列がある場合に、USING句で結合列に指定しないことで、エラーを回避できます

だから、「USING 句を使用しない」ではなく「USING 句を使って、データ型の異なる列を結合列に指定しない」ですよね?

ChatGPT にどのように質問したのかがわからないのでプロンプトに合わせた回答を返している可能性もありますが、少なくとも同問題の解説で AI Assistant に聞いてみたら選択肢の正誤は同じでしたよ。

ちなみに、ご提示の ChatGPT の回答

USING は両方のテーブルで同じデータ型の列が必要。データ型が異なるとエラーになる。

ですが、これは正しいです。そして解説も「同じ名前で異なるデータ型」の列を USING で指定しないことでエラーを回避できる という話です。
ChatGPT くんが、何を問われているかや利用シーンを正しく理解せずに正誤判断してるとしか思えないですけどね。(「どのような場合にUSING句を使用しますか」ではなく「どのような場合に USING 句が使えるか」と誤読してるんじゃないかというレベル)


コメント

k kota0706

2025/03/09 07:25

早々のご回答とてもありがたいです。 当方としては、設問の「どのような場合にUSING句を使用しますか(該当するものを2つ選択して下さい)。」で、「結合する2つの表に同じ列名でデータ型の異なる列がある場合」の選択肢が正にならないのではと以前感じます。 当方の質問文が悪く誤解を招いたかもしれませんが、解説の内容に質問したのではなく、正解の選択肢について質問させていただきました。

a arashi1977

2025/03/09 13:47

> 解説の内容に質問したのではなく、正解の選択肢について質問させていただきました。 ん? ChatGPT くんが正答だと判断した根拠として提示している説明がおかしいので「ChatGPT くんが間違ってると思いますよ」と言っているつもりだったのですが、「解説の内容」というのは最強 WEB 問題集と ChatGPT くんのどちらのことをおっしゃっていますか?

k kota0706

2025/03/10 19:26

ご回答ありがとございます。 最強 WEB 問題集を指していました。 arashi1977さんからご指摘いただいた下記について質問させてください。 「どのような場合に USING 句が使えるか」と誤読しているのでは?の部分ですが、設問は「どのような場合にUSING句を使用しますか(該当するものを2つ選択して下さい)。」とあります。ここについては、誤読していますでしょうか? また、上記が誤読していない場合、「結合する〜」の選択肢が正解の理由を解説していただけないでしょうか。 →当方は「同じ名前で異なるデータ型」の列を USING で指定しないことでエラーを回避できる」は、USING句を使用するケースに該当しないと考えています。

a arashi1977

2025/03/11 23:02

> 「どのような場合に USING 句が使えるか」と誤読しているのでは?の部分ですが、設問は「どのような場合にUSING句を使用しますか(該当するものを2つ選択して下さい)。」とあります。ここについては、誤読していますでしょうか? すみません、そこはわたしにはわかりません。ChatGPT くんが誤読しているのかはプロンプト依存ではないかなと思っています。 ですので、 > 上記が誤読していない場合 についても答えようがないです… なお、念のためですが、わたしのコメントの趣旨は「この問題の解答間違ってないか?の根拠として提示されている ChatGPT くんの解説(=正誤判断の根拠)が誤っているようにみえます」であって、「kota0706 さんが最強WEB問題集の設問や解説を理解できていないのでは」というものではないことはご理解いただければ幸いです。

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

2025/03/11 16:48

横から失礼します。
ChatGPTの回答云々は一旦おいておいて、単純に本設問を確認してみました。

  • 結合しようとしている2つの表がある。
  • それぞれの表に、同名の列が2つある。
  • 同名の列2つのうち、1つは型も一致、もう1つは型が異なる。

このような状況だと仮定して、回答の選択肢と解説をみると、

  1. 結合する2つの表の一部の列を結合列として使用する場合

USING句で結合列を指定することで、同名の列が複数ある場合に一部の列だけを結合列として使用できる。
USING句を使用するケースとして適切。

  1. 結合する2つの表に同じ列名でデータ型の異なる列がある場合

USING句で「同名だが型が異なる列ではない、もう一方の同名の列」を結合列として指定することで、エラーなく結合できる。
※ 前述の#1のケースと意図は同じようなもので、同名の列が複数ある場合にそのうちいずれか1つを指定して、他の同名の列は結合に使用しないというもの。

ちなみに、ChatGPTの回答で正答とされている「結合列の値が一方の表にしか存在しない場合」ですが、これは解説にもある通り「USING句」云々というより「外部結合」の特徴・用途と考える方が妥当かなと思いました。(もちろん外部結合の中でUSING句を使うことはできますが、「結合列の値が一方の表にしか存在しない場合」と「USING句」は試験問題として出題されてきたら、私個人的には話として直接繋がらない印象です)

私の理解がずれているかもしれません。的外れなコメントとなっていたらすみません。


コメント

k kota0706

2025/03/11 19:11

rink_rewさん ご回答ありがとうございます。 「結合する2つの表に同じ列名でデータ型の異なる列がある場合」の選択肢から、データ型が異なるケースと一致するケースが存在するということを読み取ることが、当方にはできなかったみたいです。 正直、邪推の域に感じますが、オラクルの試験なのでそういうものだと納得します。 ここまでお付き合いありがとうございました。

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

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