- 締切済み
updateについて(SQL)
こんばんわ。現在、oracle8i,SQLを勉強中で基本的な事はできるようになったのですが、わからない所が出てきたのでよろしくお願いします。 売上票 年月日 当日売上 前日売上 ------------------------ 2000/04/11 100 2000/04/10 150 2000/04/09 90 2000/04/08 120 このようなテーブルがある時に前日売上に一つ前のレコードの当日売上の値を更新したいのですが、そのような事をSQL文(1文)で実現することはできるのでしょうか?updateするときに一つ前のレコードの値を取得することは出来るのでしょうか?いろいろとサイトを回って探してみたのですが、該当レコードの値を操作するものはみつかったのですが、他のレコードを操作するものは見つかりませんでした。 よろしくお願いします。見当違いな質問でしたらお許し下さい。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
>なにか一つ前のレコードを指定できるものがあるかと思っていました。 別に不可能なわけではない。 効率の問題はあるけど、次のようなSQLで更新できるハズ。 update 売上票 x set 前日売上 = ( select y.当日売上 from (select * from 売上票 order by 年月日 desc) y where y.年月日 < x.年月日 and rownum=1 ) ; ただ、処理効率を落としてまで、前日売上を同一レコード上に 管理する必要があるか?というところで、検討の余地があるかと思います。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
おそらく、質問者の 「前日」 とは 「直近の営業日」 ってことでは? TSUTAYAのようなところであれば、「-1」で納得
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
テーブル設計の善し悪しについては、話を棚上げして、 技術的に可能かどうかだけ書きますが... >そのような事をSQL文(1文)で実現することはできるのでしょうか? >updateするときに一つ前のレコードの値を取得することは出来るのでしょうか? update 売上票 x set 前日売上 = (select y.当日売上 from 売上票 y where y.年月日 = x.年月日 - interval '1' days) とかで良いのではないでしょうか。(未検証ですが)
お礼
お礼が遅くなり申し訳ありません。やはりそのように、whereで一日マイナスして指定するという風になるのですね。なにか一つ前のレコードを指定できるものがあるかと思っていました。まだまだ勉強が足りないようです。ありがとうございました。
- gogogoahead
- ベストアンサー率43% (10/23)
「年月日/当日売上/前日売上」というテーブル定義を見直しましょう。 「年月日/当日売上」であるべきです。 データの見せ方とデータの持ち方を混同すると、頭の悪そうなデータ設計になってしまいますよ。
お礼
早速の回答ありがとうございます。設計自体に問題があるのですね。言われてみればその通りですね。ですからサイトを探しても見つからないわけですね。 もしこのようなことを無理矢理やろうと思えば「年月日/当日売上/前日売上」から「当日売上」をひとつずらして取得しそれを結合という形にせざるを得ないということでしょうか?
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
やってやれないことはありませんが、、、 入れ子のFrom句内に、データとって云々。。。 って感じになると思うのですが、、、 それよりも、テーブルのカラムとしての必要性が感じないです。 複雑な前日値取得部のFunctionを作成して、クエリなどで1カラムにはめるだけで、前日参照が可能だと思いますよ。
お礼
早速の回答ありがとうございます。#2の方が言われているように、設計自体に問題があるのですね。ですから検索しても出てこないのですね。まだまだ勉強が足りないようです。ありがとうございました。
お礼
お礼が遅くなり申し訳ありません。今回は参考書にのっていた例題をやりながらふと疑問に思い、質問させていただきました。実際の現場ではそのようなことも含めて考えていかなければならないのですね。勉強になりました。ありがとうございました。