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