刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

SQL: 別テーブルの内容を反映させる

少し前、同僚が悩んでました。

テーブル更新に失敗したデータベース(1)と正しい内容の古いデータベース(2)があります。
ここで、データベース(2)からローを抽出し、その内容でデータベース(1)を更新したい。

え?やっちゃえばイイじゃなーい。

まぁ、別のRDBなのは面倒なので置いといて、同じRDB内で再現してみます。
期待する結果はこんな感じ。
テーブル1にテーブル2の内容を上書きするイメージです。

Photo

この例の環境は、前回と同様に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使うと簡単にできますよ。