質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2669閲覧

【SQL】相関副問合せについて

yuki116633

総合スコア13

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/03/14 13:01

編集2017/03/14 13:34

データベーススペシャリストを学んでいます。
下記問題の答えが以下のようになるのか理解できません。
以下のSQLが正解とのことですが、何故、このSQLが実行できるのか分かりません。

出典
問題の出典

問題文

"社員"表から,男女それぞれの最年長社員を除くすべての社員を取り出すSQL文とするために,aに入る副問合せはどれか。ここで,"社員"表は次の構造とし,下線部は主キーを表す。

社員(社員番号,社員名,性別,生年月日)
※社員番号が主キーです。

SQL

1--問題文のSQL 2SELECT 社員番号,社員名,性別,生年月日 3FROM 社員 AS S1 4WHERE 生年月日 > ( a ) 5 6 7--答え 8SELECT 社員番号,社員名,性別,生年月日 9FROM 社員 AS S1 10WHERE 生年月日 > (SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別=S2.性別)

例えば、社員表に以下のようなレコードが入っているとしたら、

イメージ説明

WHERE 生年月日>1954-11-20,1966-03-10 となり、そもそもSQLの構文として問題があるかと思います。

どなたかご教示いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

いえ、問題ありません。

相関副問合せは、メインのテーブル(ここではs1)の各行ごとに評価されるので、「WHERE 生年月日>1954-11-20,1966-03-10」というように解釈されることはなく、性別に合った方の最早生年月日が適用されます。

投稿2017/03/14 13:42

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki116633

2017/03/14 14:29

なるほど!各行ごとに評価ですか! やっと理解できました!ありがとうございます。
guest

0

SQL

1SELECT 社員番号,社員名,性別,生年月日 2FROM 社員 AS S1 3WHERE 生年月日 > ANY (SELECT 生年月日 FROM 社員 AS S2 WHERE S1.性別=S2.性別)

投稿2017/03/14 13:39

yambejp

総合スコア114581

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/03/14 13:43

あら、選択肢があったのですね・・・
guest

0

可能なら問題の出典を明示された方が良いです。SQLは実際にCREATE TABLE文やINSERT文を用意して実行に実行しないと理解は難しいです。だから、質問にCREATE TABLE文やINSERT文を載せた方が解決が早いです。また、Oracleはマルチバイト文字を含んだテーブル名や列名などはダブルクォートで囲まないと動作保障されません。

SQL

1ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS' ; 2 3SELECT "社員番号","社員名","性別","生年月日" 4FROM "社員" S1 5WHERE S1."生年月日" > (SELECT MIN(S2."生年月日") FROM "社員" S2 WHERE S1."性別"=S2."性別") ;

投稿2017/03/14 13:25

編集2017/03/14 13:53
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki116633

2017/03/14 13:37

失礼致しました。問題の出典を追記いたしました。
maisumakun

2017/03/14 13:38

タグはOracleになっていますが、データベーススペシャリストということは、標準SQLが前提と思われます。
Orlofsky

2017/03/14 13:39

上に書きましたが、SQLを実行して動作確認してください。
maisumakun

2017/03/14 13:41

最年長=「生年月日は最も早い」なので、評価の向きも元ので問題ないです。
Orlofsky

2017/03/14 13:51

そっか、勘違いしてすみません。回答を直しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問