- ベストアンサー
SQL文のとり方を教えてください
- 以前同内容で質問させていただきましたが、再度依頼させていただきたく投稿しました。
- 1件の依頼No.にぶらさがる配送先が3か所あります。この中で一番新しい(=若い)日付の配送日&到着日をとりたいです。
- 配送日と到着日はワンセットと考えて、新しい日付の配送日がとれたら、自動的に隣の到着日もとれるイメージです。(例でいけば上から2つ目の配送日:20110106 到着日:20110107)どういう風にSQL文を書いたらいいかわかりません。どなたか教えて頂けませんか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SQLを考える時には理論を考えないと いけません。それと、質問が曖昧です。 >この中で一番新しい(=若い)日付の 日付は二つあるんですよね? 配送日なのか到着日なのかハッキリ しません。配送日が早くても、到着日が 遅い場合もあるのでは? 「新しい」と言いますが、2行目は一番 古いですよ。 ここでは「古い配送日」と仮定します。 (1)テーブルBから依頼No毎に、一番 日付の古い(小さい)ものを抽出する。 (2)上記クエリとテーブルBを依頼Noと 最も古い日付と結合させ、依頼Noと 枝番を抽出する。 (3)上記のクエリと依頼No、枝番が一致 するデータを抽出する。 これを表わすと以下のようになる。 SELECT A.* FROM テーブルB A INNER JOIN (SELECT B.依頼No,B.枝番 FROM テーブルB B INNER JOIN (SELECT D.依頼No,MIN(D.配送日) 過去日 FROM テーブルB D GROUP BY D.依頼No) C ON B.依頼No=C.依頼No AND B.配送日=C.過去日) E ON A.依頼No=E.依頼No AND A.枝番=E.枝番 ちょっと分かり難いので説明します。 2番目のサブクエリ"(SELECT D.依頼No~) C" この部分が(1)にあたります。このカッコの 内側は依頼No毎に最過去日を取っています。 1番目のサブクエリ"(SELECT B.依頼No~) E" ここは最初のクエリ(Cというエイリアス)と 依頼No、日付が一致するクエリで(2)にあたり ます。 最も外側の"SELECT A.*~"が目的の結果を 得るためのものです。 外国語なんでね、日本人の考えと逆順になる ところがイヤですね。
その他の回答 (1)
- yamada_g
- ベストアンサー率68% (258/374)
テーブルAは使う必要があるのでしょうか? 欲しいデータはテーブルBだけでも事足りますよね。 http://okwave.jp/qa/q6431441.html の回答で問題ないと思うのですが・・ ちなみに上記の回答の「table名」の箇所には今回の質問でいう<テーブルB>が入ります。 a、b とあるのは、ただのエイリアスだということは分かってらっしゃいますか?
お礼
ご丁寧な説明に感謝致します。 無事作成できました。有難うございました。