Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQL Serverでデータを更新する場合には、二通りの方法があります。

一つは皆さんご存じの「UPDATE」。そしてもう一つが「UPDATE JOIN」を使った方法です。

そこで今回はこの「UPDATE JOIN」を使った方法について解説してみたいと思います。

UPDATE JOINと聞くと、学習段階の方にとっては何やら聞いたことのないワードに聞こえるかもしれませんが、今回もわかりやすく解説していきますので最後までお付き合いください!

UPDATE JOINとは

UPDATE JOINという言葉はあまり聞きなれないかもしれませんが、言い換えるならSELECTした結果を基にUPDATEするというようにも置き換えることが出来ます。

INSERT文の「INSERT SELECT」は学習段階の方も聞いたことがあると思いますが、これのUPDATE版だと思ってもらって構いません。

ただしJOIN句があるため、テーブルの連結を行う点では単純にSELECTではないことに注意してください。

またUPDATE JOINには次のような特徴があります。

ポテパンダの一言メモ

JOIN句には「INNER JOIN」と「LEFT(RIGHT) JOIN」がありますが、UPDATE JOIN内で使用するJOIN句によっては結果が変わってくるため、どのJOIN句を使うかの選定が必要不可欠となります。

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パートで分けて考えると非常にシンプルに理解できると思います。

なお動作の順番としては次のような工程を辿っています。

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句についての解説を行いましたが、いかがでしたか?

開発を行うにあたりデータベースの更新は頻繁に行うものですから、出来るだけクエリを簡潔に記述するように心がける必要があります。

また、シンプルに記述することにより、実運用を開始した後で修正の必要が出た場合などにも、人的ミスの危険性を減らすことにも繋がります。

学習中の方はこの記事をしっかりと読んで、こうしたクエリの使い方を出来るだけ多く学んでおきましょう。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。