助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26622
問題を開く
PRODUCTS表とSALES表の構造を確認して下さい。
以下の問合せと同じ結果になるSQL文はどれですか。
SELECT prod_id FROM products
INTERSECT
SELECT prod_id FROM 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文の実行結果は次のようになります。
選択肢を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文の実行結果は次のようになります。
SQLを表示
SELECT prod_id FROM products
INTERSECT
SELECT prod_id FROM sales;
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);
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が入っている前提だと思うのですが特にその記述も無いことと、
仮にこの状況が発生している場合にどのような結果が戻るかが知りたかったのですが、
検索してみた限りで見つからず質問させていただいた次第です。
よろしければご教示いただければ幸いです。
r
rink_rew
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が設定されていないのが気になっていましたが、 設定せずとも正解の状態になるのですね。ありがとうございました。