« SQL: UNIONでは暗黙のソート処理あり | トップページ | 初ライブに行ってきた »

2014年2月 5日 (水)

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使うと簡単にできますよ。

« SQL: UNIONでは暗黙のソート処理あり | トップページ | 初ライブに行ってきた »

仕事部屋」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/564846/59078176

この記事へのトラックバック一覧です: SQL: 別テーブルの内容を反映させる:

« SQL: UNIONでは暗黙のソート処理あり | トップページ | 初ライブに行ってきた »

2014年11月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
サイト内検索
ココログ最強検索 by 暴想

Twitter

開発Twitter

無料ブログはココログ