2011-01-24 51 views
8

Temelde SQL Server 2008 R2 veritabanına sahibim. Veritabanında Düğüm ve Bağlantı adlı bir tablo var. Bağlantı, Düğümdeki bir Kimlikle ilgili bir StartNodeId ve EndNodeId içerir. Veritabanında ayrıca, Düğüm ve Bağlantı arasında daha hızlı bir denetim için bir Bağlantı tablosu, bu Bağlantı ile ilgili bu Düğüm veya bu Bağlantı ile ilgili düğümler bulunmaktadır. Bağlantı tablosu bir Kimlik anahtarı, NodeId ve LinkId içerir. Ben Birden çok güncelleştirme ve ekleme ile birleştirin

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; 

ben "An hata mesajı almak çalıştım ben

çalışıyorum ne mümkün görünmüyor ifadeleri birleştirme kullanmaya çalışıyorum benim ekler yapıyorum ne zaman sorunudur 'ZAMAN KAZANMIŞ' türü eylemi, birleştirme bildiriminin "UPDATE" yan tümcesinde bir kereden fazla görünemez "

Eğer Başlangıç ​​Düğümleri ve Bitiş Düğümlerini ayrı ayrı eklemeye çalışırsam Ben bağlantıları ile sona

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

Herkes bunu iyi yol bildiğini eğer öyleyse temelde merak ediyorum (şaşırtıcı değil) silinmesini? Hala birleştirme deyimini

Teşekkür

Edit

kullanarak bunu yapmak mümkün olmak istiyorum Mümkünse: Farklı bir kaynağı kullanarak bu verileri birleştirme farklı bir yol bulduk, problem çözüldü.

+0

Neden 'TARGET.NodeId' öğesini güncelleştiriyorsunuz? Test etmeye çalıştığınız gibi aynı şeyi güncellemek istiyorsunuz. –

cevap

17

Belki birden WHEN MATCHED böylece

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 

için Fakat ilk dalı olarak dönüştürebilirsiniz hata iletisi olamaz şikayet

ama bir şey eksik CASE'un, TARGET.NodeId = Source.StartNodeId ve TARGET.NodeId = Source.StartNodeId ayarlarında olduğu gibi vurduğu ve benzer şekilde ikinci dal için olduğu zaman, t o

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