仕事で悔しかった話
- すばひ
- 2020年2月15日
- 読了時間: 5分
とっても悔しくて恥ずかしい話なんですが、
リベンジしたいなぁ~となっている件があります。
仕事で、とは書いたのですがとどのつまりSQLが作れませんでした。てけてん。これ私が生きてる価値はもう無いのでは・・・???
やりたかったことはUPDATE文の作成なんですが。私、そういえばUPDATE文って殆ど書いたことないことにその場で気づいたんで、意外と文法が分からないんですよね。元々用意されていたSQLを実行したらエラーになったから改修する。という流れで私がそのUPDATE文を触ることになったんです。
目的としてはまあ、UPDATEなんで特定テーブルの更新なんですが、難しいのがその条件。いや、条件自体は簡単なものなんですが、それをUPDATE文でやる。というのが難しく結果的にその日の内には作成できませんでした。つらみ。つらたん。まじお天道様に顔向けできない。もう嫌。
で、条件というのが、
同一の商品を格納したAテーブル、Bテーブルが存在します。
Aテーブルの商品Aの「価格」に対し、Bテーブルの「価格」の値で更新する。というもの。
一件、一件の商品IDとかでUPDATEかかず、JOINした結果で結合できたレコードを更新したい。という内容です。
これがですね。できないんですね。
うわこれ、文章で書くとめっちゃ簡単に思えるな。。。
まず、試したのが
UPDATE Aテーブル FROM Aテーブル JOIN Bテーブル SET A.価格 = B.価格
記述の正確性はおいといてこういうの書きました。
そこで、全く動かないのでググったところ、今回Oracleだったんですが、OracleではUPDATEの中にFROM句は使用できないんですね~~~。いや、たしかに書いたことも見たこともないけど!!!寧ろ他のDBで書けるやつあるのかい!ってキレてPC壊したら現場で新しいPC支給してもらいました。始末書も書きました。
で、上のが当然ダメなので色々模索し、次に書いたのが
UPDATE Aテーブル
SET A.価格 = ( SELECT B.価格 FROM Bテーブル JOIN Aテーブル ON B.商品ID = A.商品ID )
だったんですが、AテーブルもBテーブルも商品の購入日ごとにレコードが有り、商品IDが多対多になってしまってUPDATE文に怒られてしまいました。
実際はそれは分かってたつもりだったのでSETの右側のインラインビューではAとBに対し商品IDを一意にした上で書いていたのですが、UPDATEのところに書いているAテーブルが一意じゃないから、多対一みたいな現象になってい模様。。。しかし、FROMも書けないしSELECTもないから当然GROUP BYで集合を取って一意にすることもできません。考えて行き着いたというか唯一使えるWHERE句でなんとかするしかないんだろうなぁ。ということでWHERE句に手を出すことにしました。なんででしょうか。手を出すって凄く背徳的な響きがありますよね。君と響き合うRPG。
最後に試したのがこんな感じ。上記は変えれないだろうなぁと思ってSETまでは変更せず純粋にWHERE句のみ追加しました。
UPDATE Aテーブル
SET A.価格 = ( SELECT B.価格 FROM Bテーブル JOIN Aテーブル ON B.商品ID = A.商品ID )
WHERE (A.商品ID,A.購入日) = (SELECT A.商品ID,MAX(A.購入日) FROM Aテーブル GROUP BY A.商品ID )
WHERE句で強制的に更新元のAテーブルの商品に対し、最新購入日のレコードのみにする想定で書きましたが、これでも「単一行副問合せにより2つ以上の行が戻されます」が表示されてしまうものですから、もう一回PC壊して遂に現場出禁になってしまいました。週明け山吹色のお菓子を持参して取締役にご挨拶に行くことになりましたが私、山吹色のお菓子これで買ってこいって渡されたお金全部いきなりステーキで使っちゃってもう残ってないんですよね。困ったな。いきなり無職!になっちゃうかも!(別にいきなりじゃない)
他に試したものだと(これORACLEでできるっぽいこと書いてるブログちらほらあったけどほんまか?検証したいなぁ)UPDATEのテーブルを2つ書く記述のやり方を試しました。具体的にはこんな感じ。
UPDATE Aテーブル , ( SELECT B.商品ID B.価格 FROM Bテーブル JOIN Aテーブル ON B.商品ID = A.商品ID )※最新購入日で絞り込み入れてます
SET A.価格 = B.価格
みたいなやつ
これはSET句の記述がないよ!ってエラーがでてブチ切れそうでした。いや書いとるやんけ!!!!ってなりますやん?え?なりませんか。あ、すみません。。。ちなみにここのSETがないよ!みたいなエラー出してくれてたんでみたら,で区切ったもう一つのテーブルのSETがないよ!みたいなエラーっぽかったです。このときにはもう深く検証できる余裕がなく、PCの前でストロングゼロ飲んでたので真の答えはわからずじまいです。(ストロングゼロはお客さんに見つかって取り上げられました。でも私はスタバのカップの中にワンカップ入れて飲んでたらバレないことを知ってるので何事もなかったようにスタバ買いにいきました。)
いや、しかし悔しい。結局今回はもうSELECTで更新対象は簡単に洗い出せたのでSELECTで抽出した結果に対し、Excel上でUPDATE文をワークシート関数で生成するっていうちょっと個人的には納得できないですけどPC2台も壊したので流石に口答えはできずそういうやり方でやることとなりました。因みにPCはリースのものなので補償代金が凄まじく半年分の給与の支払い停止が確定しました。えーまじ。困ったなぁ。
ただ、Aテーブルの内容をBテーブルと結合した上でBの情報で更新する。というのは今後もどこかで出てきそうなのでちゃんと書ける。あるいは理屈を理解しておきたいと思いました。
本当は途中からPLSQLでCURSOR二重ループさせればこんな悩まなくてもよいのでは・・・・??????????????????????????????と思ってましたが私も終電までの数時間でそのPROCEDUREを作ることはできず、断念しました。いや、断念すべきではなかったんだろうなあれは。終電なんてないんですよ。だった5,6時間したらすぐまたくるじゃん。なんでベストを尽くさなかったのか。多分ですね、私が悔しいのはSQLが作れなかったことでも、PCの修理代金で今後の給与が無くなったことでもなく、自分ができる可能性を放棄したことなんですよね。やればできるんだからやるべきだったんですよ私は。これができないから一生人の目を見て話せないし、前を向くこともできない陰キャオタクなわけです。また後悔を重ねてしまった。もう年も40も過ぎてるのにこんなことでいいのでしょうか。いや、よくないなぁ。樹海とか練炭とか考えたほうが良いかもしれないです。いや、今回はほんとうに情けないやつだったというお話ですね。
それはそうと先日14歳の誕生日を迎えたのでようやく私もエヴァンゲリオンのパイロットになれました。頑張って使徒から第3新東京市を守って行きたいと思います。
あでゅー
Comments