ほとんどの場合、SQLの更新は直接参照を使用して実行されます 特定のテーブルに(UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1 )。ただし、場合によっては、テーブルの内容を間接的に変更することが有益であることが判明することがあります。 、セカンダリクエリステートメントから取得したデータのサブセットを使用します。
UPDATEの実行 セカンダリSELECTを使用する ステートメントは、主に使用しているSQL Serverのバージョンに応じて、2つの方法のいずれかで実行できます。両方のオプションについて簡単に説明し、最適なオプションを見つけられるようにします。
すべてのSQLServerインストールで、このアクションを実行する最も基本的な方法は、INNER JOINを使用することです。 、これにより、2つの異なるテーブルの列の値が相互に比較されます。
UPDATE
books
SET
books.primary_author = authors.name
FROM
books
INNER JOIN
authors
ON
books.author_id = authors.id
WHERE
books.title = 'The Hobbit'
上記の例では、UPDATING books.primary_author authors.nameと一致するフィールド JOININGによる「TheHobbit」の場合 クエリ内の両方のテーブルを、authors.idのそれぞれの一致する値に一致させます およびbooks.author_id 。
MERGEを使用して更新と挿入を同時に行う
SQL Server 2008以降では、Microsoftは非常に便利なMERGEを導入しました。 上記のINNER JOINと同様の操作 メソッドですが、MERGE UPDATEの両方を実行しようとします およびINSERT 一緒にコマンドします。これにより、実行されたクエリに基づいて2つのテーブルが効果的に同期され、2つが一致するために必要に応じてレコードが更新および挿入されます。
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
MERGEを使用する場合の完全なクエリ 確かに、基本的なINNER JOINよりも少し複雑です 、しかし、操作がどのように機能するかを理解すると、この機能が本当にどれほど強力であるかをすぐに理解できます。
最初の数行はかなり自明です:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
MERGE INTOしたい (UPDATE / INSERT )books セカンダリauthorsを使用したテーブル テーブルであり、同じbooks.author_id = authors.idに基づいて2つを照合しています 比較。
MERGEの場所 コマンドが異なるのは、次の分岐ロジックにあります。
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
ここでは、レコードがMATCHEDの場合にのみアクションを実行するようSQLに要求しています。 –既存のレコードが見つかったとき。その場合、標準のUPDATEを実行します 以前と同じように、books.primary_authorを設定します authors.nameと等しいフィールド フィールド。
最後に、クエリで一致しない一致する比較レコードが検出された場合 存在する場合は、代わりにINSERTを実行します 。
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
ここでは、SQLにINSERTを要求しているだけです。 booksへの新しいレコード テーブルとauthor_idの値の受け渡し およびprimary_author 関連するauthorsから取得したフィールド テーブルレコード。
MERGEの最終結果 ステートメントは、すべての場合です authorsの作成者 表では、対応する本がbooksに存在するかどうかを確認します 。レコードが見つかった場合は、books.primary_authorを確認します UPDATEを使用して設定されます 、一致するものが見つからない場合は、booksに新しいレコードを追加します 。
これで、UPDATEに使用できる2つの異なる方法をしっかりと理解する必要があります。 二次的な比較SELECTを使用したSQLのレコード ステートメント。