プロが教えるわが家の防犯対策術!

テーブルには複数の主キーがあり、そのうちの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


お分かりの方、ご教授頂けませんでしょうか。


以上、よろしくお願い致します。

A 回答 (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='男');
    • good
    • 0

あえて触れていなかったのですが、date1 は日付(date)型?


どっかのcast(to_char,to_date)で失敗してませんか?
あと、ないとは思いますが、インデックスがおかしいとか。

例と同じ構造の別テーブルを作っていろいろ試してみてはいかがでしょうか?
    • good
    • 0

副問い合わせの部分は、min関数ですから、項目(date1)の最小値'20120101'が取得されます。


親の問い合わせは、date1が、副問い合わせの結果のものをとってきているのですから、複数業出るのは正常です。
    • good
    • 0
この回答へのお礼

メッセージありがとうございます。

2件の情報を取得するには、下記のSQL自体は問題ないと言う事ですよね。

SELECT * FROM TABLE WHERE date1 IN(SELECT min(date1) FROM TABLE WHERE id=1 and name='A' and sex='男');

3件の情報すべて取得した理由は不明ですが。。

お礼日時:2012/12/03 22:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!