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

単純なIFEXISTSに対するMERGEの利点は何ですか?

    MERGEは、INSERT、UPDATE、およびDELETEロジックを1つのDMLステートメントに結合するため、アトミックです。単一行のUPSERTSを実行している場合、利点はそれほど明白ではありません。たとえば、UPSERTの単純な実装は次のようになります。

    IF  EXISTS (SELECT * FROM t1 where [email protected])
        UPDATE t1 SET ... WHERE [email protected]
    ELSE
        INSERT INTO t1 (...) VALUES (...)
    

    ただし、これをトランザクションでラップしないと、更新する行がSELECTとUPDATEの間で削除される可能性があります。その問題に対処するために最小限のロジックを追加すると、次のようになります。

    BEGIN TRAN
    IF  EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where [email protected] )
        UPDATE t1 SET ... WHERE [email protected]
    ELSE
        INSERT INTO t1 (...) VALUES (...)
    COMMIT
    

    このロジックは、MERGEステートメントでは必要ありません。

    CURSORSとMERGEステートメントの間に比較する必要のある比較はありません。



    1. SQLServerで同等のORACLEConnectby句

    2. PHPのユーザー名またはメールアドレスでログインします

    3. 親アセンブリで販売されたコンポーネントの数量を計算するSQLクエリを作成するにはどうすればよいですか? (Postgres 11 /再帰CTE?)

    4. PostgreSQLテーブルの履歴の実装