2011-01-24 14 views
8

असल में मेरे पास एक SQL Server 2008 R2 डेटाबेस है। डेटाबेस में नोड और लिंक नामक एक टेबल है। लिंक में नोड में किसी आईडी से संबंधित StartNodeId और EndNodeId शामिल है। डाटाबेस को नोड और लिंक के बीच एक लिंक टेबल की त्वरित जांच के लिए भी लिंक की आवश्यकता होती है, क्या यह नोड इस लिंक से संबंधित है या नोड्स इस लिंक से संबंधित हैं। लिंक तालिका में एक पहचान कुंजी, नोडआईडी और लिंकआईडी शामिल है। मेरी समस्या है जब मैं अपने आवेषण कर रहा हूँ मैं जब मैं करने की कोशिश कीएकाधिक अपडेट और सम्मिलन के साथ विलय करें

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; 

मैं त्रुटि संदेश मिलता है "एक बयान जो मैं क्या कोशिश कर रहा हूँ

करने के लिए सक्षम होने के लिए नहीं लग रहे विलय का उपयोग करने के कोशिश कर रहा हूँ 'WHEN MATCHED' प्रकार की कार्रवाई एक मेर्ज स्टेटमेंट के 'अद्यतन' खंड में एक से अधिक बार प्रकट नहीं हो सकती है "

यदि मैं प्रारंभ नोड्स और एंड नोड्स को अलग-अलग उदाहरणों को सम्मिलित करने का प्रयास करता हूं

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

मैं लिंक के साथ खत्म हटाया जा रहा है (आश्चर्य की बात नहीं) तो बुनियादी तौर पर मैं अगर कोई ऐसा करने का एक अच्छा तरीका है की जानता था सोच रहा था? मैं अभी भी किसी मर्ज कथन का उपयोग

धन्यवाद

संपादित करें यह करने के लिए सक्षम होने के लिए चाहते हैं यदि संभव हो तो: मैं एक अलग स्रोत का उपयोग इस डेटा को मर्ज करने का एक अलग तरीका मिल गया है, समस्या अब हल हो गया है।

+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 

लिए लेकिन पहले शाखा के रूप में कुछ लेकिन

त्रुटि संदेश शिकायत आप नहीं हो सकता याद कर रहा हूँ CASETARGET.NodeId = Source.StartNodeId पर हिट किया गया है और TARGET.NodeId = Source.StartNodeId भी सेट करता है और इसी तरह दूसरी शाखा के लिए यह लगता है कि टी को सरल बनाना ओ

WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN 
    UPDATE SET TARGET.LinkId = SOURCE.Id  
संबंधित मुद्दे