Fondamentalmente ho un database SQL Server 2008 R2. Il database ha una tabella chiamata Nodo e collegamento. Il link contiene StartNodeId e EndNodeId relativi a un ID nel nodo. Il database richiede anche una tabella di collegamento tra nodo e collegamento per un controllo più rapido, ad esempio, questo nodo è correlato a questo collegamento o che i nodi sono correlati a questo collegamento. La tabella Link contiene una chiave Identity, NodeId e LinkId. Il mio problema è quando sto facendo i miei inserti Sto cercando di utilizzare fondersi dichiarazioni che non sembrano essere in grado di fare quello che sto cercandoUnisci a più aggiornamenti e inserti
Quando ho provato
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;
ottengo il messaggio di errore "An l'azione di tipo "QUANDO ABBINATO" non può apparire più di una volta in una clausola "UPDATE" di un'istruzione MERGE "
Se provo a inserire Nodi iniziali e Nodi finali separatamente, ad es.
--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;
io alla fine con i collegamenti in fase di cancellazione (non sorprendente) in modo sostanzialmente mi chiedevo se qualcuno conosceva un buon modo di fare questo? Se possibile mi piacerebbe essere in grado di farlo ancora utilizzando una dichiarazione merge
Grazie
Edit: ho trovato un modo diverso di fondere questi dati utilizzando una fonte diversa, il problema è ora risolto.
Perché si sta aggiornando 'TARGET.NodeId'? Sembra che tu stia aggiornando esattamente la stessa cosa che stai provando a testare. –