@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

WHERE句内で「値=最大値」を取得する方法について

1
投稿者投稿内容
タオル
常連さん
会議室デビュー日: 2005/04/27
投稿数: 43
投稿日時: 2005-11-02 15:52
お世話になっております。
SOLSERVER2000で開発しております。

WHERE句内で、以下のように外部結合しています。

SELECT
*
FROM
A,B,C
WHERE
A.customerCD *= B.customerCD
AND
B.customerCD *= C.customerCD
AND
B.Yoteibi = @
AND
C.Yoteibi = A

customerCDは主キーです。
A・B・Cテーブルには共にcustomerCDが
あるのですが、B・Cテーブルは主キーとして
更にYoteibiがあります。
このSQL文で取得したいレコードは1件です。

BとCテーブルのYoteibiがcutomerCDに対して複数件存在するので、
上記のSQL文を実行すると、予定日が存在する分だけ
複数件のレコードを取得してしまいます。

この為、条件として、
「B・CテーブルのYoteibiが最新のレコードのみ」
取得したいのですが、
方法がわかりません。

前提として、タイトル通りWHERE句内でどうにかならないかと
考えています。
WHERE句以前のSQL文はマクロによる自動作成だからです。
MAX()でとれるのかな?と思っていたのですが、
WHERE句内でMAXを使用したところ、
以下のように怒られました。
”次の場合以外は WHERE 句内で集計を使用できません。集計が HAVING 句または選択リスト内のサブクエリにある場合、および集計する列が外部参照の場合。”

そこで、どうすればよいかわからず質問させていただきました。
毎度低レベルな質問で恐縮ですが、何卒宜しくお願いいたします。
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-11-02 16:31
こんにちは、でっちです。

ご質問の件は「副問合せ」で行けるかな?

コード:

SELECT
*
FROM
A,B,C
WHERE
A.customerCD *= B.customerCD
AND
A.customerCD *= C.customerCD
AND
B.Yoteibi = (SELECT MAX(Yoteibi) FROM B WHERE B.customerCD = A.customerCD)
AND
C.Yoteibi = (SELECT MAX(Yoteibi) FROM C WHERE C.customerCD = A.customerCD)



SQL*Serverが今手元にないので試せてはないです。
あと会議室はDatabase Expertが適切だと思います。

[追記]
#被った
#ただ、あおいさんの書かれたものと、私の書いたものでは結果が異なるので注意して下さい。
あと、
コード:

WHERE
A.customerCD *= B.customerCD
AND
B.customerCD *= C.customerCD


元のSQLでは、ここが通らないはずなので、修正しました。
確か「外部結合の要求を持つクエリは許可されません。」とか言うエラーになるはず。


[ メッセージ編集済み 編集者: でっち6号 編集日時 2005-11-02 16:41 ]
檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 2005-11-02 16:31
副問い合わせでできませんか?
自分の環境で以下のSQLでできたと思います。

SELECT
*
FROM
A,B,C
WHERE
A.customerCD = B.customerCD
AND
B.customerCD = C.customerCD
AND
B.Yoteibi = ( select max(B.Yoteibi) from B)
AND
C.Yoteibi = ( select max(C.Yoteibi) from C)
タオル
常連さん
会議室デビュー日: 2005/04/27
投稿数: 43
投稿日時: 2005-11-02 17:19
でっち6号さん、あおいさん
お二人とも適切なアドバイスありがとうございます。

>でっち6号さん
Database Expertにするべきか悩んだのですが、、
やはりあちらがよろしかったのですね、失礼致しました。
ご指摘に感謝いたします。

さて、でっち6号さん、あおいさんのおかげで、
希望の事ができたなぁと考えていたのですが、
また新たに問題が、、

B.Yoteibi、C.Yoteibiともにchar型なのですが、
同じ日が複数ある事がありえるとの事でした。

DISTINCTなどを副問合せの中に入れたら、
同じYoteibiが同じ日付で複数あった場合も
重複分を抜けるかなぁ等と思っていましたが、
やはりできませんでした。

大変申し訳ないのですが、、
上記内容を実現できる方法はあるでしょうか?

毎度すみません。。
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-11-02 17:34
でっちです。

引用:

タオルさんの書き込み (2005-11-02 17:19) より:
B.Yoteibi、C.Yoteibiともにchar型なのですが、
同じ日が複数ある事がありえるとの事でした。

DISTINCTなどを副問合せの中に入れたら、
同じYoteibiが同じ日付で複数あった場合も
重複分を抜けるかなぁ等と思っていましたが、
やはりできませんでした。



???同一データが複数あってもMAXかければ1件になるので、DISTINCTなど入れなくても行けるはずですが???
ちょっと問題点が分らないので、データなども合わせて説明していただけますか?
1

スキルアップ/キャリアアップ(JOB@IT)