2011-01-24 4 views
8

В основном у меня есть база данных SQL Server 2008 R2. В базе данных есть таблица под названием Node и Link. Ссылка содержит StartNodeId и EndNodeId, относящиеся к идентификатору в узле. В базе данных также требуется таблица ссылок между узлом и ссылкой для более быстрой проверки, например, этот узел связан с этой ссылкой или какие узлы связаны с этой ссылкой. Таблица ссылок содержит ключ Identity, 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; 

Я получаю сообщение об ошибке «An действие типа «КОГДА СОГЛАСНО» не может появляться более одного раза в предложении «ОБНОВЛЕНИЕ» в заявлении 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; 

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

Благодарности

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

+0

Почему вы обновляете 'TARGET.NodeId' вообще? Кажется, вы обновляете его точно так же, как вы пытаетесь проверить. –

ответ

17

Может быть, я что-то, но

Сообщение об ошибке жалуется, вы не можете иметь не хватает множественным WHEN MATCHED, чтобы вы могли конвертировать

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

Но первой ветви CASE ударяется, когда TARGET.NodeId = Source.StartNodeId, а также устанавливает TARGET.NodeId = Source.StartNodeId и аналогично для второй ветви, что, похоже, упрощает t o

WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN 
    UPDATE SET TARGET.LinkId = SOURCE.Id  
Смежные вопросы