in memory of 複合キー
どうよこのタイミングの外し方。我ながら惚れ惚れしちゃうね。複合キーの追憶。
この仕事始めて最初に関わったシステムで、保守やってました。これが非道いのなんのって、稼動後5年経っても枯れる事を知らずに毎日の様に電話が鳴ると云う、いやー鍛えられた。
もうデータパッチなんてガンガンです。しかも毎日何千万とかお金が動いてるデータ。SQLはそれで覚えた。
で、複合キーを持つテーブルをある条件のものに対してのみ区分を修正しなきゃいけないなんて時に、さて困った。その条件ってのは別のテーブルとJOINしないと取って来れないのだこれが。
例えば、受注番号(文字列)+連番(数値)の複合キーを持つ受注明細に修正をしなくちゃいけなくて、こいつに紐つく他テーブルのあるカラムの値でその修正の要否が判るとする。
SELECT 受注明細.受注番号, 受注明細.連番 FROM 受注明細 INNER JOIN 他テーブル ON 受注明細.他テーブルへのFK = 他テーブル.PK WHERE 他テーブル.col2 = 'bbb'
とかあるとしますよ。本当はもっともっと複雑で他テーブルがあと2〜3個あった気がしますが。これで複合キーが特定出来ますけども、これをどうやってUPDATE文とくっつけるのか。
いやーストアド書いてカーソル回すしかないんじゃないかと思って、時間がねぇ〜面倒くせぇ〜と頭を抱えてた所へ俺にSQLのこすい技の数々を教えてくれた方が登場。「こうすりゃいいじゃん」と。
UPDATE 受注明細 SET 何ちゃら区分 = 'A' WHERE 受注明細.受注番号 || TO_CHAR(受注明細.連番) IN ( SELECT 受注明細.受注番号 || TO_CHAR(受注明細.連番) FROM 受注明細 INNER JOIN 他テーブル ON 受注明細.他テーブルへのFK = 他テーブル.PK WHERE 他テーブル.col2 = 'bbb' )
「こうするとインデックス見なくなっちゃうんだけどね、データパッチだからいいでしょ」と言葉を残し颯爽と去っていく師匠。その背中に手を合わせましたねぇ。
最初からそんなデータパッチ当てる必要のないしっかりしたシステム作ればいい話なんですけどね。