SQL Serverでデータを更新する場合には、二通りの方法があります。
一つは皆さんご存じの「UPDATE」。そしてもう一つが「UPDATE JOIN」を使った方法です。
そこで今回はこの「UPDATE JOIN」を使った方法について解説してみたいと思います。
UPDATE JOINと聞くと、学習段階の方にとっては何やら聞いたことのないワードに聞こえるかもしれませんが、今回もわかりやすく解説していきますので最後までお付き合いください!
UPDATE JOINとは

UPDATE JOINという言葉はあまり聞きなれないかもしれませんが、言い換えるならSELECTした結果を基にUPDATEするというようにも置き換えることが出来ます。
INSERT文の「INSERT SELECT」は学習段階の方も聞いたことがあると思いますが、これのUPDATE版だと思ってもらって構いません。
ただしJOIN句があるため、テーブルの連結を行う点では単純にSELECTではないことに注意してください。
またUPDATE JOINには次のような特徴があります。
- JOIN結果が0件の場合にはUPDATEされない
- 複数行にわたりJOINされた場合、最初にJOINされた結果でUPDATEされる
UPDATE JOINの記述方法

それではUPDATE JOINの記述方法について見ていきましょう。
UPDATE JOINは次のように記述します。
UPDATE
[テーブル1]
SET
[テーブル1].[カラム1] = [テーブル2].[カラム1],
[テーブル1].[カラム2] = [テーブル2].[カラム2],
・
・
・
FROM
[テーブル1]
(INNER/LEFT) JOIN
[テーブル2]
ON
[テーブル1].[カラム1] = [テーブル2].[カラム1]
WHERE
条件
基本的にはUPDATEの構造とよく似ていますが、SELECTではなくJOINを使います。
JOINの記述に関しては今回の記事とは関係ないため割愛しますが、先ほども説明したようにUPDATEパートとJOINパートで分けて考えると非常にシンプルに理解できると思います。
なお動作の順番としては次のような工程を辿っています。
- 1. JOINl句でテーブルを連結させる
- 2. 条件付きSELECTで目的のレコードを検索する
- 3. UPDATE句で該当レコードを更新する
UPDATE JOIN句の良いところは、わざわざ1行ずつUPDATEを回すことなく、一つのクエリで該当する全てのレコードを一度に書き換えることが出来る点です。
コードの簡素化は、実運用後に変更作業が必要となった場合でも非常に少ない修正で済みます。
確実に覚えるようにしましょう。
UPDATE JOINのサンプルコード

では実際にサンプルを使ってUPDATE JOINの動作を見てみましょう。
今回のサンプルコード用テーブルは以下のようになっています。
// 「sample_table_A」の作成
CREATE TABLE sample_table_A (
stuff_id INTEGER NOT NULL,
name NVARCHAR(30) NOT NULL,
medical_checkup NVARCHAR(10) NOT NULL,
CONSTRAINT sample_table_A_PK PRIMARY KEY (stuff_id)
);
GO
// 「sample_table_B」の作成
CREATE TABLE sample_table_B (
id INTEGER NOT NULL,
stuff_id INTEGER NOT NULL,
sex NVARCHAR(10) NOT NULL,
checkup_date DATE,
CONSTRAINT sample_table_B_PK PRIMARY KEY (id),
CONSTRAINT sample_table_B_FK
FOREIGN KEY (stuff_id) REFERENCES sample_table_A(stuff_id)
ON UPDATE CASCADE
);
GO
// 各テーブルにレコード追加
INSERT INTO sample_table_A VALUES(00001, 'Alex', 'YET');
INSERT INTO sample_table_A VALUES(00002, 'Jonathan', 'YET');
INSERT INTO sample_table_A VALUES(00003, 'Olivia', 'YET');
INSERT INTO sample_table_A VALUES(00004, 'Mia', 'YET');
INSERT INTO sample_table_A VALUES(00005, 'George', 'YET');
INSERT INTO sample_table_B VALUES(1, 00001, 'male', null);
INSERT INTO sample_table_B VALUES(2, 00002, 'male', '2020-05-24');
INSERT INTO sample_table_B VALUES(3, 00003, 'female', null);
INSERT INTO sample_table_B VALUES(4, 00004, 'female', '2020-06-11');
INSERT INTO sample_table_B VALUES(5, 00005, 'male', '2020-04-16');
GO
SELECT * FROM sample_table_A;
GO
stuff_id name medical_checkup
----------- ------------------------------ ---------------
1 Alex YET
2 Jonathan YET
3 Olivia YET
4 Mia YET
5 George YET
SELECT * FROM sample_table_B;
GO
id stuff_id sex checkup_date
----------- ----------- ---------- ----------------
1 1 male NULL
2 2 male 2020-05-24
3 3 female NULL
4 4 female 2020-06-11
5 5 male 2020-04-16
テーブル「sample_table_A」は親テーブルでスタッフの名前と健康診断の有無、テーブル「sample_table_B」は子テーブルで性別と受診日があります。
今回のサンプルでは、テーブルを内部結合し”checkup_date”が「NULL」以外のスタッフの”medical_checkup”を”YET” → “DONE”に書き換えを行います。
UPDATE sample_table_A
SET
sample_table_A.medical_checkup = 'DONE'
FROM
sample_table_A
INNER JOIN
sample_table_B
ON
sample_table_A.stuff_id = sample_table_B.stuff_id
AND
sample_table_B.checkup_date IS NOT NULL
;
GO
(3 行処理されました)
SELECT * FROM sample_table_A;
GO
stuff_id name medical_checkup
----------- ------------------------------ ---------------
1 Alex YET
2 Jonathan DONE
3 Olivia YET
4 Mia DONE
5 George DONE
実行結果からstuff_idが「2」「4」「5」のmedical_checkupが”DONE”に書き換わっていることが確認できます。
このように、UPDATE JOIN句を使用することで、任意の書き換えを一つのクエリで完結させることが可能となります。
まとめ
今回はUPDATE JOIN句についての解説を行いましたが、いかがでしたか?
開発を行うにあたりデータベースの更新は頻繁に行うものですから、出来るだけクエリを簡潔に記述するように心がける必要があります。
また、シンプルに記述することにより、実運用を開始した後で修正の必要が出た場合などにも、人的ミスの危険性を減らすことにも繋がります。
学習中の方はこの記事をしっかりと読んで、こうしたクエリの使い方を出来るだけ多く学んでおきましょう。
JOIN句には「INNER JOIN」と「LEFT(RIGHT) JOIN」がありますが、UPDATE JOIN内で使用するJOIN句によっては結果が変わってくるため、どのJOIN句を使うかの選定が必要不可欠となります。