質問: 現在、社内の部品採番台帳をAccessからMySQLに移行する作業をしています。 Accessの約6万件のデータをMySQLのワークテーブルに入れ込みました。 現在の部品台帳のワークテーブルは以下のようになっています。 | CODE | KEYCODE | CATEGORY | NAME | 備考 | | --- | --- | --- | --- | --- | | AA1000-01 | AA1000-01 | 0 | 抵抗1 | 特に別管理を必要としないもの | | BA1000-01 | AA1000-01 | 1 | 抵抗1 | AA1000-01と同じ部品だけど△△管理するもの | | CA1000-01 | AA1000-01 | 2 | 抵抗1 | AA1000-01と同じ部品だけど○○管理するもの | | BA1001-01 | AA1001-01 | 1 | 抵抗2 | このようにAAのコードがないものもあります | | CA1002-01 | AA1002-01 | 2 | 抵抗3 | このようにAAのコードがないものもあります | これを以下のように1つのレコードにしたいと考えています。 | KEYCODE | CODE-A | CODE-B | CODE-C | NAME | | --- | --- | --- | --- | --- | | AA1000-01 | AA1000-01 | BA1000-01 | CA1000-01 | 抵抗1 | | AA1001-01 | NULL | BA1001-01 | NULL | 抵抗2 | | AA1002-01 | NULL | NULL | CA1002-01 | 抵抗3 | これを実現するSQL(できる限り実行速度が速いもの)を教えていただけないでしょうか。 自分で考えたサブクエリーで引き当てしようとすると 6万件のデータでは遅くて一向に処理が返ってきませんでした。 --- 実はAccessのデータをCSV(SJIS)に落として C#で作ったアプリで文字分解してKEYCODE、CATEGORYを作成し UTF8変換してMYSQLのワークテーブルに入れ込みました。 SQLでスマートにできない場合は、この処理過程でCATEGORY=0のものを1つ1つ先に テーブルにインサートして、CATEGORY=1のものをKEYCODEで検索してUPDATEして・・・ なければインサートして・・・ という処理も視野に入れていますが、全然スマートじゃない気がして質問しました。
回答: 最近のMySQLでは相関サブクエリーでも早くなっていると聞いています。 因みに、ワークテーブルにインデックスは作っていますか? (KEYCODE,CODE)のインデックスがあれば、相関サブクエリーでもそこそこイケるんじゃないでしょうか?※NAMEもあったほうがより早くなるかも。 因みに相関サブクエリーの場合ってこんな感じかと思いますけど。 ``` select keycode ,(select code from tbl where keycode=t.keycode and code like 'A%') as code_a ,(select code from tbl where keycode=t.keycode and code like 'B%') as code_b ,(select code from tbl where keycode=t.keycode and code like 'C%') as code_c , name from tbl t group by keycode, name ``` インデックスがある状態で遅いなら、A.Ichiさんの提示されるjoinで結合する方法ですね。 その場合でも、インデックスがあった方が早いと思います。