2011-01-24 37 views
8

Về cơ bản tôi có cơ sở dữ liệu SQL Server 2008 R2. Cơ sở dữ liệu có một bảng có tên là Node và Link. Liên kết chứa một StartNodeId và EndNodeId liên quan đến một Id trong nút. Cơ sở dữ liệu cũng yêu cầu một bảng Liên kết giữa Node và Link để kiểm tra nhanh hơn, đó là nút này liên quan đến liên kết này hoặc các nút nào có liên quan đến liên kết này. Bảng Link chứa một khóa Identity, NodeId và LinkId. Vấn đề của tôi là khi tôi đang làm chèn của tôi, tôi đang cố gắng sử dụng các báo cáo mà dường như không có khả năng làm những gì tôi đang cố gắngHợp nhất với nhiều bản cập nhật và chèn

merge Khi tôi cố gắng

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; 

tôi nhận được thông báo lỗi " hành động của loại 'WHEN MATCHED' không thể xuất hiện nhiều hơn một lần trong mệnh đề 'CẬP NHẬT' của câu lệnh MERGE "

Nếu tôi thử chèn các nút bắt đầu và nút kết thúc một cách riêng biệt

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

Tôi kết thúc với các liên kết bị xóa (không đáng ngạc nhiên) vì vậy về cơ bản tôi đã tự hỏi liệu có ai biết cách làm tốt không? Nếu có thể tôi muốn để có thể làm điều đó vẫn còn sử dụng một tuyên bố hợp nhất

Cảm ơn

Edit: Tôi đã tìm thấy một cách khác nhau của việc sáp nhập dữ liệu này sử dụng một nguồn khác nhau, vấn đề bây giờ giải quyết.

+0

Tại sao bạn cập nhật 'TARGET.NodeId'? Bạn dường như đang cập nhật nó cho chính xác điều tương tự như bạn đang thử nghiệm. –

Trả lời

17

Có lẽ tôi đang thiếu một cái gì đó nhưng

Thông báo lỗi phàn nàn bạn không thể có nhiều WHEN MATCHED vì vậy bạn có thể chuyển đổi

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 

Nhưng khi chi nhánh đầu tiên của số CASE được nhấn khi TARGET.NodeId = Source.StartNodeId và cũng đặt TARGET.NodeId = Source.StartNodeId và tương tự cho nhánh thứ hai thì dường như đơn giản hóa t o

WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN 
    UPDATE SET TARGET.LinkId = SOURCE.Id  
Các vấn đề liên quan