都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

質問に答えてみた

 関東甲信地方は、7 月 28 日に梅雨明けしました。今から本格的な夏が始まりますね、と思いましたが来週はそれほど真夏な感じでもありませんね。
f:id:koogucc11:20160730102344p:plain
 
 しかし、今日は暑い!午前中から子供とポケモン探しに行きましたが、耐え切れず途中で涼むことに。そして、ついでに記事を書くことにwww
f:id:koogucc11:20160730112652j:plain

 最近質問受けたので、その内容について書いてみます。異なるテーブルが複数あり、それらのデータをあるキーをベースにデータをマージしたいというものです。レイアウトはほぼ同一で下記のような感じです。

CREATE TABLE 
    Real_Table1 (
    col1 INT NOT NULL,
    col2 INT NOT NULL,
    col3 NVARCHAR ( 256 )
);

 複数のテーブルには、下記のようにデータが格納されているとします。

テーブル1
(0, 1, '0-設定1')
(0, 2, '0-設定2')
(0, 3, '0-設定3')
(0, 4, '0-設定4')

テーブル2
(1, 1, '1-設定1')
(1, 2, '1-設定2')
(1, 5, '1-設定5')
(1, 6, '1-設定6')

テーブル3
(2, 1, '2-設定1')
(2, 2, '2-設定2')
(2, 8, '2-設定5')
(2, 9, '2-設定6')

 上記のテーブルを下記のようにマージしたいと思います。テーブル1の情報をベースに、テーブル2およびテーブル3のデータを下記のようにマージします。

col1	col2	col3
0	1	2-設定1
0	2	2-設定2
0	3	0-設定3
0	4	0-設定4
1	5	1-設定5
1	6	1-設定6
2	8	2-設定5
2	9	2-設定6

 早速試してみましょう。まずはテーブルレイアウトとデータを準備します。

CREATE TABLE 
    Real_Table1 (
    col1 INT NOT NULL,
    col2 INT NOT NULL,
    col3 NVARCHAR ( 256 )
);

CREATE TABLE 
    Real_Table2 (
    col1 INT NOT NULL,
    col2 INT NOT NULL,
    col3 NVARCHAR ( 256 )
);

CREATE TABLE 
    Real_Table3 (
    col1 INT NOT NULL,
    col2 INT NOT NULL,
    col3 NVARCHAR ( 256 )
);

INSERT INTO 
    Real_Table1 ( col1, col2, col3)
VALUES 
    (0, 1, '0-設定1'),
    (0, 2, '0-設定2'),
    (0, 3, '0-設定3'),
    (0, 4, '0-設定4')

INSERT INTO 
    Real_Table2 ( col1, col2, col3)
VALUES 
    (1, 1, '1-設定1'),
    (1, 2, '1-設定2'),
    (1, 5, '1-設定5'),
    (1, 6, '1-設定6');

INSERT INTO 
    Real_Table3 ( col1, col2, col3)
VALUES 
    (2, 1, '2-設定1'),
    (2, 2, '2-設定2'),
    (2, 8, '2-設定5'),
    (2, 9, '2-設定6');

f:id:koogucc11:20160730103731p:plain

 それではデータをマージしてみます。下記のクエリを SQL Server Management Studio で実行してみましょう。

SELECT
    col1,
    col2,
    col3
INTO 
    #Temp_Table
FROM 
    Real_Table1; 
MERGE INTO 
    #Temp_Table t1
USING 
    Real_Table2 t2 ON 
	t2.col2 = t1.col2
    WHEN MATCHED THEN
        UPDATE SET t1.col3 = t2.col3
    WHEN NOT MATCHED THEN
        INSERT VALUES (t2.col1, t2.col2, t2.col3 );
MERGE INTO 
    #Temp_Table t1
USING 
    Real_Table3 t2 ON 
    t2.col2 = t1.col2
    WHEN MATCHED THEN
        UPDATE SET t1.col3 = t2.col3
    WHEN NOT MATCHED THEN
        INSERT VALUES (t2.col1, t2.col2, t2.col3 );

SELECT * FROM #Temp_Table

 仕様通りマージすることができました。
f:id:koogucc11:20160730104140p:plain

 今もってるヘッドセットが大きく持ち運びが大変なので、小型の Bluetooth のものを新調することに。色々あって悩みました。

 ここ一か月くらい悩んだ末、PLANTRONICS Bluetooth ワイヤレスヘッドセット (モノラルイヤホンタイプ) Voyager Edge Black に!

 決めては、一番かっこいいから。以上ww
www.youtube.com