Объединить с несколькими обновлениями и вставками

В основном у меня есть база данных SQL Server 2008 R2. В базе данных есть таблица под названием «Узел и ссылка». Ссылка содержит StartNodeId и EndNodeId, относящиеся к идентификатору в Node. База данных также требует таблицы связей между узлом и ссылкой для более быстрой проверки, скажем, связан ли этот узел с этой ссылкой или какие узлы связаны с этой ссылкой. Таблица Link содержит ключ идентификации, NodeId и LinkId. Моя проблема в том, что когда я делаю свои вставки, я пытаюсь использовать операторы слияния, которые, похоже, не могут делать то, что я пытаюсь

Когда я пробовал

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;

, я получаю сообщение об ошибке «Действие типа 'КОГДА MATCHED 'не может появляться более одного раза в предложении' UPDATE 'оператора MERGE "

Если я попытаюсь вставить начальные и конечные узлы по отдельности, например

    --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;

Я заканчиваю тем, что ссылки удаляются (что неудивительно), так что в основном мне было интересно, знает ли кто-нибудь хороший способ сделать это? Если возможно, я хотел бы иметь возможность делать это, используя оператор слияния

Спасибо

Изменить: Я нашел другой способ слияния этих данных, используя другой источник, проблема теперь решена.

9
задан Manatherin 25 January 2011 в 10:30
поделиться