sql >> Database >  >> RDS >> Sqlserver

Wat zijn de voordelen van MERGE ten opzichte van eenvoudig IF BESTAAT?

MERGE combineert INSERT-, UPDATE- en DELETE-logica in één DML-statement en is daarom atomair. Als je UPSERTS met een enkele rij doet, zijn de voordelen minder voor de hand liggend. Een naïeve implementatie van een UPSERT kan er bijvoorbeeld als volgt uitzien:

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

Zonder dit echter in een transactie te verpakken, is het mogelijk dat de rij die we gaan updaten tussen de SELECT en de UPDATE wordt verwijderd. Door minimale logica toe te voegen om dat probleem aan te pakken, krijgen we dit:

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

Deze logica is niet nodig met de MERGE-instructie.

Er zijn geen vergelijkingen tussen CURSORS en de MERGE-instructie.



  1. Bouw boom van parent_id id tabelstructuur

  2. Een tekenreeks met scheidingstekens doorgeven in de NOT IN-clausule

  3. Is er een SQL-query die altijd nul resultaten oplevert?

  4. mySQL-query tussen twee datums en twee keer