39 votes

T Exemple de fusion SQL nécessaire à la compréhension

Suivantes:

MERGE dbo.commissions_history AS target
USING (SELECT @amount, @requestID) AS source (amount, request)
ON (target.request = source.request)
WHEN MATCHED THEN
    UPDATE SET amount = source.amount
WHEN NOT MATCHED THEN
    INSERT (request, amount)
    VALUES (source.request, source.amount);

à partir de http://stackoverflow.com/a/2967983/857994 est un assez chouette façon de le faire insérer/mettre à jour (et de suppression auprès de certains ajoutée par le travail). J'ai du mal à suivre mais même après quelques recherches sur google.

Quelqu'un peut s'il vous plaît:

  • expliquer un peu, en termes simples, - la documentation MSDN mutilé mon cerveau dans ce cas.
  • montrez-moi comment il peut être modifié de sorte que l'utilisateur peut saisir des valeurs pour la quantité et la demande au lieu de l'avoir sélectionné à partir d'un autre emplacement de base de données?

En gros, je voudrais l'utiliser pour insérer/mettre à jour à partir d'une application en C# avec des informations provenant de fichiers XML que je suis. Donc, j'ai besoin de comprendre comment je peux formuler une requête à la main pour obtenir mon analysé des données dans la base de données avec ce mécanisme.

75voto

RThomas Points 6261

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X