• 締切済み

SQL MIN句

テーブルには複数の主キーがあり、そのうちの3つの主キーを元に 最も古い日付の情報を取得したいです。 同じデータが複数あるので、副問い合わせ(=)でエラーになると思ったのですが エラーにならずにすべてのデータが取得されてしまいます。 テーブル id name sex date1 1 'A' '男' 20120101 1 'A' '男' 20120101 2 'A' '女' 20120102 select * from table where date1 = (select min(date1) from table where id = 1 and name = 'A' and sex='男'); 下記のような情報を取得するには、SQLとして間違えておりますでしょうか。 ↓ id name sex date1 1 'A' '男' 20120101 1 'A' '男' 20120101 お分かりの方、ご教授頂けませんでしょうか。 以上、よろしくお願い致します。

みんなの回答

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

行を一意に識別できる unique かつ not null な属性群が主キーですから, > id name sex date1 > 1 'A' '男' 20120101 > 1 'A' '男' 20120101 と,同じ内容の行が複数存在しているというのが事実であるなら,それは質問者が主キーだと思い込んでいるけれど主キー設定されていないということを示しています。 となると,失礼ながら,質問文に挙げられたデータ例の真偽も少々訝しく感じられてきてしまいます。確認のため差し支えなければ,次の3つのSQLをそれぞれ実行して表示された結果を,そのままCopy&Pasteで提示していただけるとありがたいです。 (1) select * from table; (2) select min(date1) from table where id = 1 and name = 'A' and sex='男'; (3) select * from table where date1 = (select min(date1) from table where id = 1 and name = 'A' and sex='男');

noname#189141
noname#189141
回答No.2

あえて触れていなかったのですが、date1 は日付(date)型? どっかのcast(to_char,to_date)で失敗してませんか? あと、ないとは思いますが、インデックスがおかしいとか。 例と同じ構造の別テーブルを作っていろいろ試してみてはいかがでしょうか?

noname#189141
noname#189141
回答No.1

副問い合わせの部分は、min関数ですから、項目(date1)の最小値'20120101'が取得されます。 親の問い合わせは、date1が、副問い合わせの結果のものをとってきているのですから、複数業出るのは正常です。

NeilMania
質問者

お礼

メッセージありがとうございます。 2件の情報を取得するには、下記のSQL自体は問題ないと言う事ですよね。 SELECT * FROM TABLE WHERE date1 IN(SELECT min(date1) FROM TABLE WHERE id=1 and name='A' and sex='男'); 3件の情報すべて取得した理由は不明ですが。。