こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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)

投稿日時 - 2007-03-11 12:51:09

QNo.2822853

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

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’

投稿日時 - 2007-03-11 17:33:08

ANo.1

何の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をつけるなりしてください。

それと、注意点としては、日付型を「=」で比較する場合、
時間も比較されてしまうので、時間が異なる場合は日付だけ比較されるように修正してください。

投稿日時 - 2007-03-11 13:47:46

あなたにオススメの質問