助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26622
問題を開く
PRODUCTS表とSALES表の構造を確認して下さい。





以下の問合せと同じ結果になるSQL文はどれですか。

 SELECT prod_id FROM products
 INTERSECT
 SELECT prod_id FROM sales;

正解

SELECT DISTINCT prod_id FROM products p
JOIN sales s USING(prod_id);

解説

INTERSECT演算子を用いた複合問合せでは、2つの問合せの結果の共通する行を表示します。また、重複した行は排除されます。
設問のSQL文の実行結果は次のようになります。


SQLを表示
SELECT prod_id FROM products
INTERSECT
SELECT prod_id FROM sales;


選択肢を1つずつ確認してみましょう。

・SELECT prod_id FROM products
 UNION
 SELECT prod_id FROM sales;
UNION演算子を用いた複合問合せでは、2つの問合せの結果を連結し、重複行を排除して表示します。誤ったSQL文です。

・SELECT prod_id FROM products
 MINUS
 SELECT prod_id FROM sales;
MINUS演算子を用いた複合問合せでは、1つ目の問合せ結果から2つ目の問合せ結果にない行を表示します。誤ったSQL文です。

・SELECT p.prod_id FROM products p
 JOIN sales s ON p.prod_id = s.prod_id;
ON句を使用した等価結合です。結合条件p.prod_id = s.prod_idに合致する行は重複行も含め全て表示されます。誤ったSQL文です。

・SELECT distinct prod_id FROM products p
 JOIN sales s USING(prod_id);
USING句を使用した等価結合です。ON句と同様に両表のprod_idの共通した行は全て取り出されますが、SELECT句の後にDISTINCTキーワードがあるので、重複した行を排除して表示します。正しいSQL文です。
設問のSQL文と同じ実行結果になります。


SQLを表示
SELECT DISTINCT prod_id FROM products p
JOIN sales s USING(prod_id);
上に戻る

INTERSECTの解釈について

投稿日 2023/07/19

質問失礼いたします。

当該問題につきまして、両表のPROD_IDにPRIMARY KEYやUNIQUEの制約が設定されていないのですが、
仮にこの両表にPROD_IDが1001のデータが複数存在する場合でも
1001は1つしか戻らないのでしょうか?

例を挙げると

Products
PROD_ID PROD_NAME
1001 Alpha
1001 Bravo
1001 Charlie
1002 Delta

Sales
PROD_ID CUST_ID
1001 2001
1001 2002
1001 2003
1002 2004

上記の場合でも、1001は一つしか戻されない(=DISTINCT prod_id の状態になる)のでしょうか?

実用面などから基本はPROD_IDに主キーやUNIQUEが入っている前提だと思うのですが特にその記述も無いことと、
仮にこの状況が発生している場合にどのような結果が戻るかが知りたかったのですが、
検索してみた限りで見つからず質問させていただいた次第です。

よろしければご教示いただければ幸いです。

2023/07/24 18:07

例として挙げておられるデータで実際に試してみました。
INTERSECTは積をとり、重複行は含まれないのでこのような結果となるようです。

SQL> select * from test_prod;

   PROD_ID PROD_NAME
---------- -----------
      1001 Alpha
      1001 Blavo
      1001 Charlie
      1002 Delta

SQL> select * from test_sales;

   PROD_ID    CUST_ID
---------- ----------
      1001	 2001
      1001	 2002
      1001	 2003
      1002	 2004

SQL> select prod_id from test_prod intersect select prod_id from test_sales;

   PROD_ID
----------
      1001
      1002

SQL> select distinct prod_id from test_prod p join test_sales s using(prod_id);

   PROD_ID
----------
      1001
      1002

SQL>


コメント

k konomiyuduki

2023/07/28 09:32

検証いただきありがとうございます。 この問題でPRIMARY KEYが設定されていないのが気になっていましたが、 設定せずとも正解の状態になるのですね。ありがとうございました。

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

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