- 締切済み
SQL文でのデータの取得が上手くいきません
初めて質問させていただきます。 こちらのカテゴリで良いのか分からなかったのですが、よろしくお願いいたします。 SQL文を作成しているのですが、上手くいかず困っている状況です。 要件としてはテーブルAにユーザーの情報が格納されているのですが、 キーの一つとして世代(SEDAI_NO)(日付)を持っております。 今回取り出したいデータは該当ユーザーの処理日以前の最新のデータを 取得したいと思い以下のSQL文を作成しましたが、上手く行かず、最新世代を含むそれ以前の世代のデータを取得してきています。 どこがおかしいのでしょうか? よろしくお願いいたします。 【作成したSQL】 select * from テーブルA テーブルA’ where (USER_ID=該当のユーザーID) and (SEDAI_NO = (select max(SEDAI_NO) from テーブルA where SEDAI_NO = テーブルA’.SEDAI_NO AND 処理日 >= テーブルA'.SEDAI_NO)
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- venzou
- ベストアンサー率71% (311/435)
select * from テーブルA テーブルA’ where (USER_ID=該当のユーザーID) and (SEDAI_NO = (select max(SEDAI_NO) from テーブルA where USER_ID = テーブルA’.USER_ID AND 処理日 >= テーブルA.SEDAI_NO)); 元のSQLを尊重するとこんな感じかな。(Access2000で動作確認) 副問い合わせのwhere句が間違いでしょう。 該当ユーザの、処理日以前の、SEDAI_NOの最大を求めるので。 >SEDAI_NO = テーブルA’.SEDAI_NO SEDAI_NO ではなく USER_ID が同じものを選択。 >処理日 >= テーブルA'.SEDAI_NO テーブルA’ではなく、テーブルAですね。 補足 >whre区にそのままSELECT区なんて記載できなかったと思います。 「単一行副問い合わせ」とか「スカラー副問い合わせ」等と言われるものです。実装しているDBは多いと思います。 >それと、テーブルAは実体があるけど、テーブルA'は実体がないのに、 as が省略されているだけです。テーブルA’は単なる別名ですね。 select * from テーブルA as テーブルA’
- 95KD571
- ベストアンサー率40% (4/10)
何のDBを使用しているのかわかりませんが。。。 whre区にそのままSELECT区なんて記載できなかったと思います。 (最近やってないから使えるのかな?) それと、テーブルAは実体があるけど、テーブルA'は実体がないのに、 FROM区にどんなテーブルか書いてないから、これは何のテーブルか判断できないです。 たぶん、ここに載せる上で抜粋+変換したのが、おかしいだけだと思いますが。。。。 >世代(SEDAI_NO)(日付)を持っております。 >今回取り出したいデータは該当ユーザーの処理日以前の最新のデータを取得したい 最近のデータが、MAX(SEDAI_NO)で SEDAI_NOは日付型ってことですよね? select * from テーブルA, (select max(SEDAI_NO) MAX_SEDAI_NO from テーブルA where ( SEDAI_NO <= 処理日 ) AND ( USER_ID=該当のユーザーID ) ) テーブルA' where ( テーブルA.SEDAI_NO = テーブルA'.MAX_SEDAI_NO) AND ( USER_ID=該当のユーザーID ) 上記のSQLを簡単に説明すると、 テーブルAは実体テーブル、 テーブルA'はテーブルAから該当ユーザの処理日以前の 最大の世代番号を取得した仮テーブルとします。 テーブルAの世代番号とテーブルA'の最大の世代番号が 同じでかつ該当ユーザIDのもの という感じにしたのが、上記のSQLです。 エイリアスのつけ方がDBによって異なる場合があるので、 その辺は、ASをつけるなりしてください。 それと、注意点としては、日付型を「=」で比較する場合、 時間も比較されてしまうので、時間が異なる場合は日付だけ比較されるように修正してください。