基本的に、3000万レコードのテーブルAがあり、「TYPE」というタイトルの列をテーブルに追加したいと思います。コードを色にマップするルックアップテーブルBがあります。テーブルAを繰り返し処理し、テーブルAのコードをテーブルBのコードと比較してから、テーブルAのTYPE列に色を追加します。これは可能ですか?この問題への最善のアプローチは何でしょうか?表Bのコードは、表Aの実際のコードと完全には一致していません。
3 に答える
スキーマを見たり、DBMSを知らずに言うのは難しいですが、色を調べるために使用されるコードの最初の2桁が常にある場合は、どうでしょうか。
UPDATE table_a SET type = SUBSTR(code, 2)
通常どおりJOINを実行します
あなたは次のような参加をすることができます
JOIN table_b ON table_b.id = SUBSTR(table_a.code,2)
しかし、それはほとんどパフォーマンスがありません。
トランザクションのサイズに関する問題を出したり受けたりします。列を追加するのは単純なALTERTABLEであり、それを修正するためのUPDATEではありませんか。
ALTER TABLE TableA ADD (Type VARCHAR(10));
UPDATE TableA
SET Type = ((SELECT Colour FROM TableB WHERE TableA.Type = TableB.Type));
唯一注意が必要なのは、二重括弧です。これらは一部のDBMSで必要であり、他のDBMSでは必要ない場合があります(単一の括弧で十分な場合があります)。JOINでUPDATEを使用できる場合もあります。構文も完全に標準ではありません。
このマッピングは、NULLからNULLへの変更がノーオペレーションであることに依存していることに注意してください。一部の行に値があるが、それらの行のすべてがTableBのエントリと一致しない場合は、そのようなフルテーブルUPDATEに注意する必要があります。TableBに一致するものがないTableAの行のタイプをNULLに設定します。それが必要なものではなかった場合は、JOINでUPDATEを使用するか、次のように記述します。
UPDATE TableA
SET Type = ((SELECT Colour FROM TableB WHERE TableA.Type = TableB.Type));
WHERE Type IN (SELECT Colour FROM TableB WHERE TableA.Type = TableB.Type);
現在の場合、列が新しく追加されたためにNULLが含まれているため、UPDATE自体のWHERE句を省略しても問題はありません。
次のステートメントのように、表Bのコードの最初の文字を確認するだけで更新を実行できます。
update table_a
set table_a.type = table_b.type
from table_b
where table_b.code = substr(table_a.code, 1, length(table_b.code))
インデックスを使用して速度を上げることはできないため、これは少し遅い場合があります。ただし、table_bが小さい場合は、パフォーマンスが許容範囲内である可能性があります。