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'
    )

「こうするとインデックス見なくなっちゃうんだけどね、データパッチだからいいでしょ」と言葉を残し颯爽と去っていく師匠。その背中に手を合わせましたねぇ。

最初からそんなデータパッチ当てる必要のないしっかりしたシステム作ればいい話なんですけどね。