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

SQLServerでの単純なマージステートメントの例

    次の例では、T-SQLを使用してSQLServerの2つのテーブルをマージします。 VALUESを使用します ソーステーブルとしてのテーブル値コンストラクタ。

    次のようなテーブルを作成するとします。

    CREATE TABLE Idiots (
        IdiotId int IDENTITY(1,1) NOT NULL,
        FirstName varchar(50),
        LastName varchar(50)
        );
    
    INSERT INTO Idiots VALUES 
        ('Peter', 'Griffin'), 
        ('Homer', 'Simpson'), 
        ('Ned', 'Flanders');
    
    SELECT * FROM Idiots;

    結果:

    +-----------+-------------+------------+
    | IdiotId   | FirstName   | LastName   |
    |-----------+-------------+------------|
    | 1         | Peter       | Griffin    |
    | 2         | Homer       | Simpson    |
    | 3         | Ned         | Flanders   |
    +-----------+-------------+------------+

    そして、マージ操作を実行したいとします。新しい行を挿入したいのですが、ソースの値と一致する値の行がすでに存在する場合は、代わりに(新しい行を挿入する代わりに)既存の行を更新します。

    私たちはこのようにそれを行うことができます:

    DECLARE @Changes TABLE(Change VARCHAR(20));
    
    MERGE INTO Idiots AS Target  
    USING ( VALUES 
                (3, 'Ned', 'Okily Dokily!'), 
                (4, 'Lloyd','Christmas'), 
                (5, 'Harry', 'Dunne')
            ) AS Source ( IdiotId, FirstName, LastName )  
    ON Target.IdiotId = Source.IdiotId
    AND Target.FirstName = Source.FirstName
    WHEN MATCHED THEN
        UPDATE SET FirstName = Source.FirstName, LastName = Source.LastName
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (FirstName, LastName) VALUES (Source.FirstName, Source.LastName)
    OUTPUT $action INTO @Changes;
    
    SELECT Change, COUNT(*) AS Count  
    FROM @Changes  
    GROUP BY Change;

    結果:

    +----------+---------+
    | Change   | Count   |
    |----------+---------|
    | INSERT   | 2       |
    | UPDATE   | 1       |
    +----------+---------+

    2つの新しい行が挿入され、1つが更新されました。

    ここでは、テーブル値コンストラクター(VALUES)を使用しました )テーブルの新しい値を指定します。

    この場合、IdiotIdを確認しました およびFirstName 列。基本的に、IDと名が同じである場合、新しい行を挿入するのではなく、既存の行を更新する必要があります。

    WHEN MATCHEDを使用しました VALUESからのデータが発生したときに何が起こるかを指定します 句は、ターゲットテーブルのデータと一致します。この場合、VALUESからの新しいデータで行を更新するだけです。 。

    WHEN NOT MATCHED BY TARGETを使用しました 一致するものがない場合に何が起こるかを指定します。この場合、新しいデータを含む新しい行を挿入します。

    @Changesという変数も使用しました マージ操作の出力を表示します。 OUTPUTを使用しました このためのマージ操作の後の句。これが、上記の結果の表を示したものです。

    これで、ターゲットテーブルをチェックして、マージ操作がターゲットテーブルに与えた影響を確認できます。

    SELECT * FROM Idiots;

    結果:

    +-----------+-------------+---------------+
    | IdiotId   | FirstName   | LastName      |
    |-----------+-------------+---------------|
    | 1         | Peter       | Griffin       |
    | 2         | Homer       | Simpson       |
    | 3         | Ned         | Okily Dokily! |
    | 4         | Lloyd       | Christmas     |
    | 5         | Harry       | Dunne         |
    +-----------+-------------+---------------+

    馬鹿番号3(Ned)の名前が更新されていることがわかります。また、2つの新しい馬鹿がテーブルに追加されたことがわかります(ロイドとハリー)。


    1. 初心者のためのSQLチュートリアル

    2. 高度なSQL:T-SQL挿入ステートメントのバリエーションとさまざまなユースケース

    3. 既存のOracleシーケンスを使用してHibernateでIDを生成するにはどうすればよいですか?

    4. インスタンス間でのバックアップの監視