ほとんどの場合、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のレコード ステートメント。