Si vous n'êtes pas familier avec les instructions join puis c'est là que vous avez besoin pour commencer. Comprendre comment les jointures de travail est la clé de tout le reste. Une fois que votre familier avec des jointures, puis la compréhension de la fusion est plus facile en pensant qu'il y a plein de jointure avec les instructions à suivre pour les lignes qui ne sont ou ne correspondent pas.
Donc, en utilisant l'exemple de code fourni permet de regarder le tableau commissions_history
| Amount | Request | <other fields |
--------------------------------------------
| 12.00 | 1234 | <other data |
| 14.00 | 1235 | <other data |
| 15.00 | 1236 | <other data |
L'instruction merge crée un plein jointure entre une table, appelée la "cible" et une expression qui renvoie un tableau (ou un ensemble de résultats qui est logiquement très similaire à une table comme un CCE) a appelé la "source".
Dans l'exemple donné, c'est à l'aide de variables comme la source qui nous supposerons ont été fixés par l'utilisateur ou le passé en tant que paramètre.
DECLARE @Amount Decimal = 18.00;
DECLARE @Request Int = 1234;
MERGE dbo.commissions_history AS target
USING (SELECT @amount, @requestID) AS source (amount, request)
ON (target.request = source.request)
Crée le jeu de résultats suivant lorsque la pensée d'une jointure.
| Amount | Request | <other fields | Source.Amount | Source.Request |
------------------------------------------------------------------------------
| 12.00 | 1234 | <other data | 18.00 | 1234 |
| 14.00 | 1235 | <other data | null | null |
| 15.00 | 1236 | <other data | null | null |
En utilisant les instructions figurant sur quoi faire à la cible, à la condition qu'une correspondance a été trouvée.
WHEN MATCHED THEN
UPDATE SET amount = source.amount
La cible de la table ressemble maintenant à ceci. La ligne avec la demande de 1234 est mis à jour à 18.
| Amount | Request | <other fields |
--------------------------------------------
| 18.00 | 1234 | <other data |
| 14.00 | 1235 | <other data |
| 15.00 | 1236 | <other data |
Depuis une correspondance a ÉTÉ trouvée rien ne se passe. Mais disons que les valeurs de la source étaient comme cela.
DECLARE @Amount Decimal = 18.00;
DECLARE @Request Int = 1239;
La jointure résultante devrait ressembler à ceci:
| Amount | Request | <other fields | Source.Amount | Source.Request |
------------------------------------------------------------------------------
| 12.00 | 1234 | <other data | null | null |
| 14.00 | 1235 | <other data | null | null |
| 15.00 | 1236 | <other data | null | null |
| null | null | null | 18.00 | 1239 |
Depuis une ligne correspondante n'a pas été trouvé dans la cible de l'exécution d'une instruction à l'autre clause.
WHEN NOT MATCHED THEN
INSERT (request, amount)
VALUES (source.request, source.amount);
Résultant dans une table cible qui ressemble maintenant à ceci:
| Amount | Request | <other fields |
--------------------------------------------
| 12.00 | 1234 | <other data |
| 14.00 | 1235 | <other data |
| 15.00 | 1236 | <other data |
| 18.00 | 1239 | <other data |
La fusion des déclarations vrai potentiel, c'est quand la source et la cible sont les deux grandes tables. Comme il peut faire une grande quantité de mises à jour et/ou hors-textes pour chaque ligne avec une simple déclaration.
Une dernière remarque. Il est important de garder à l'esprit que, not matched
par défaut, l'intégralité de la clause not matched by target
, cependant, vous pouvez spécifier not matched by source
à la place de, ou en plus, la clause de défaut. L'instruction merge prend en charge les deux types de décalage (enregistrements dans la source non pas dans la cible, ou d'enregistrements dans l'objectif n'est pas dans la source tel que défini par la clause). Vous trouverez une documentation complète, des restrictions, et la syntaxe complète sur MSDN.