質問: データベーススペシャリストを学んでいます。 下記問題の答えが以下のようになるのか理解できません。 以下のSQLが正解とのことですが、何故、このSQLが実行できるのか分かりません。 出典 問題の出典 問題文 > > "社員"表から,男女それぞれの最年長社員を除くすべての社員を取り出すSQL文とするために,aに入る副問合せはどれか。ここで,"社員"表は次の構造とし,下線部は主キーを表す。 > > > 社員(**社員番号**,社員名,性別,生年月日) > > ※社員番号が主キーです。 > > > ``` --問題文のSQL SELECT 社員番号,社員名,性別,生年月日 FROM 社員 AS S1 WHERE 生年月日 > ( a ) --答え SELECT 社員番号,社員名,性別,生年月日 FROM 社員 AS S1 WHERE 生年月日 > (SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別=S2.性別) ``` 例えば、社員表に以下のようなレコードが入っているとしたら、 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/8801aabc8bb221da8c9a01ef05857115.gif) WHERE 生年月日>1954-11-20,1966-03-10 となり、そもそもSQLの構文として問題があるかと思います。 どなたかご教示いただければ幸いです。
回答: 可能なら問題の出典を明示された方が良いです。SQLは実際にCREATE TABLE文やINSERT文を用意して実行に実行しないと理解は難しいです。だから、質問にCREATE TABLE文やINSERT文を載せた方が解決が早いです。また、Oracleはマルチバイト文字を含んだテーブル名や列名などはダブルクォートで囲まないと動作保障されません。 ``` ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS' ; SELECT "社員番号","社員名","性別","生年月日" FROM "社員" S1 WHERE S1."生年月日" > (SELECT MIN(S2."生年月日") FROM "社員" S2 WHERE S1."性別"=S2."性別") ; ```