Fusionner avec plusieurs mises à jour et des inserts
Fondamentalement, j'ai un Serveur SQL server 2008 R2 base de données. La base de données dispose d'une table appelée Nœud et le Lien. Lien contient une StartNodeId et EndNodeId relatives à un Id de Nœud. La base de données nécessite également une table de Lien entre un Nœud et un Lien pour accélérer la vérification de dire, est-ce Noeud lié à ce Lien ou dont les Nœuds sont liés à ce Lien. Le Lien de la table contient une clef d'Identité, NodeId et LinkId. Mon problème est que lorsque je fais mon insère je suis en train d'utiliser merge qui ne semblent pas être en mesure de faire ce que je suis en train
Quand j'ai essayé
MERGE INTO [RoadRoutingDatabase].[dbo].[NodeToLink] AS TARGET
USING (SELECT Id, StartNodeId, EndNodeId FROM [RoadRoutingDatabase].[dbo].[Link]) AS SOURCE
ON (TARGET.LinkId = SOURCE.Id)
WHEN MATCHED AND TARGET.NodeId = Source.StartNodeId THEN
UPDATE SET TARGET.NodeId = SOURCE.StartNodeId,
TARGET.LinkId = SOURCE.Id
WHEN MATCHED AND TARGET.NodeId = Source.EndNodeId THEN
UPDATE SET TARGET.NodeId = SOURCE.EndNodeId,
TARGET.LinkId = SOURCE.Id
WHEN NOT MATCHED BY TARGET AND TARGET.NodeId = Source.StartNodeId THEN
INSERT (LinkId, NodeId)
VALUES (SOURCE.Id, SOURCE.StartNodeId)
WHEN NOT MATCHED BY TARGET AND TARGET.NodeId = Source.EndNodeId THEN
INSERT (LinkId, NodeId)
VALUES (SOURCE.Id, SOURCE.EndNodeId)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
Je reçois le message d'erreur "Une action de type" when MATCHED "ne peut pas apparaître plus d'une fois dans une" mise à JOUR "clause d'une instruction MERGE"
Si j'essaie de l'insertion de Nœuds à Démarrage et de Fin des Nœuds separemment, par exemple
--Insert Start Node To Link Relationships
MERGE INTO [RoadRoutingDatabase].[dbo].[NodeToLink] AS TARGET
USING (SELECT Id, StartNodeId FROM [RoadRoutingDatabase].[dbo].[Link]) AS SOURCE
ON (TARGET.NodeId = SOURCE.StartNodeId AND TARGET.LinkId = SOURCE.Id)
WHEN MATCHED THEN
UPDATE SET TARGET.NodeId = SOURCE.StartNodeId,
TARGET.LinkId = SOURCE.Id
WHEN NOT MATCHED BY TARGET THEN
INSERT (LinkId, NodeId)
VALUES (SOURCE.Id, SOURCE.StartNodeId)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
--Insert End Node To Link Relationships
MERGE INTO [RoadRoutingDatabase].[dbo].[NodeToLink] AS TARGET
USING (SELECT Id, EndNodeId FROM [RoadRoutingDatabase].[dbo].[Link]) AS SOURCE
ON (TARGET.NodeId = SOURCE.EndNodeId AND TARGET.LinkId = SOURCE.Id)
WHEN MATCHED THEN
UPDATE SET TARGET.NodeId = SOURCE.EndNodeId,
TARGET.LinkId = SOURCE.Id
WHEN NOT MATCHED BY TARGET THEN
INSERT (LinkId, NodeId)
VALUES (SOURCE.Id, SOURCE.EndNodeId)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
Je me retrouve avec des liens supprimés (pas surprenant) donc en gros je me demandais si quelqu'un connaissait un bon moyen de faire cela? Si possible, je voudrais être en mesure de le faire encore à l'aide d'une instruction merge
Grâce
Edit: j'ai trouvé une façon différente de la fusion de ces données à l'aide d'une autre source, le problème est maintenant résolu.
TARGET.NodeId
à tous? Vous semblez être mise à jour pour exactement la même chose que vous êtes en train de tester.
OriginalL'auteur Manatherin | 2011-01-24
Vous devez vous connecter pour publier un commentaire.
Peut-être que je manque quelque chose, mais
Le message d'erreur se plaint que vous ne pouvez pas avoir plusieurs
WHEN MATCHED
de sorte que vous pouvez convertirà
Mais comme la première branche de l'
CASE
est atteint lorsqueTARGET.NodeId = Source.StartNodeId
et définit égalementTARGET.NodeId = Source.StartNodeId
et de même pour la deuxième branche puis qui semble simplifier àOriginalL'auteur Martin Smith