少し前、同僚が悩んでました。
テーブル更新に失敗したデータベース(1)と正しい内容の古いデータベース(2)があります。
ここで、データベース(2)からローを抽出し、その内容でデータベース(1)を更新したい。
え?やっちゃえばイイじゃなーい。
まぁ、別のRDBなのは面倒なので置いといて、同じRDB内で再現してみます。
期待する結果はこんな感じ。
テーブル1にテーブル2の内容を上書きするイメージです。
この例の環境は、前回と同様にSQLServer2008R2のT-SQLです。
CREATE TABLE #tbl_temp1 (
code NUMERIC(2)
, name VARCHAR(20)
, value NUMERIC(3)
);
INSERT INTO #tbl_temp1 VALUES (1, 'テーブル1の1', 100);
INSERT INTO #tbl_temp1 VALUES (2, 'テーブル1の2', 200);
INSERT INTO #tbl_temp1 VALUES (3, 'テーブル1の3', 300);
INSERT INTO #tbl_temp1 VALUES (4, 'テーブル1の4', 400);DECLARE @tbl_temp2 table (
code NUMERIC(2)
, name VARCHAR(20)
, value NUMERIC(3)
);
INSERT INTO @tbl_temp2 VALUES (2, 'テーブル2の2', 2);
INSERT INTO @tbl_temp2 VALUES (4, 'テーブル2の4', 4);
SELECT * FROM #tbl_temp1;
SELECT * FROM @tbl_temp2;UPDATE A SET
A.name = B.name
, A.value = B.value
FROM #tbl_temp1 AS [A]
INNER JOIN @tbl_temp2 AS [B] ON A.code = B.code;SELECT * FROM #tbl_temp1;
DROP TABLE #tbl_temp1;
前エントリーのサンプルを変えただけなので、例が悪いかもしれません。
中間テーブル(#tbl_temp1)を、テーブル変数(@tbl_temp2)の内容で上書きしてます。
実際は、どちらも普通のテーブルに置き換えてください。
別に前述の方法だけが解決策ではないので、目的を達成できるなら何でも良いとは思います。
クライアント側のアプリで実装するとか、ストアドプロシージャでサーバ・カーソル使うとか。
もし、T-SQLで済ませたい場合に、手段のひとつとしていかがでしょう。
UPDATE文でINNER JOIN使うと簡単にできますよ。