2011-01-24 10 views
8

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.

+0

Perché si sta aggiornando 'TARGET.NodeId'? Sembra che tu stia aggiornando esattamente la stessa cosa che stai provando a testare. –

risposta

17

forse mi manca qualcosa, ma

Il messaggio di errore si lamenta, non si può avere più WHEN MATCHED modo è possibile convertire

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 

a

WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN 
    UPDATE SET TARGET.NodeId = CASE 
           WHEN TARGET.NodeId = Source.StartNodeId 
           THEN SOURCE.StartNodeId 
           ELSE Source.EndNodeId 
           END, 
       TARGET.LinkId = SOURCE.Id 

ma come il primo ramo del CASE viene colpito quando TARGET.NodeId = Source.StartNodeId e imposta anche TARGET.NodeId = Source.StartNodeId e analogamente per il secondo ramo quindi sembra che semplifichi t o

WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN 
    UPDATE SET TARGET.LinkId = SOURCE.Id  
Problemi correlati