sql >> データベース >  >> RDS >> Sqlserver

SQLServerでSELECTから更新する方法

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


    1. 新しいSQLServerカーディナリティ推定器の最初の外観

    2. SQLServerの既存の列にデフォルトの制約を追加する方法

    3. AmazonRDSポイントインタイムリカバリとClusterControlの比較

    4. INTとUnique-データベースのIDフィールドの識別子