Tôi đang sử dụng câu lệnh MERGE trong một dự án cơ sở dữ liệu để cư dữ liệu tham khảo từ một tập giá trị tĩnh, chẳng hạn như sau đây:SQL Server MERGE + Tham gia các bảng khác
MERGE INTO dbo.[User] AS TARGET
USING (VALUES
('[email protected]', 'My Name'))
AS SOURCE(UserName, FullName)
ON SOURCE.UserName = TARGET.UserName
WHEN NOT MATCHED BY TARGET THEN
INSERT (UserId, UserName, FullName)
VALUES (NEWID(), UserName, FullName);
vấn đề này được đưa ra trong khi tôi muốn để điền bảng phụ dựa trên nội dung trong các bảng khác. Ví dụ, bảng UserPermission của tôi chứa ID người dùng và ID vai trò và tôi muốn giá trị tĩnh của tôi được đặt thành ('[email protected]', 'Admin') và có thể tham gia vào Người dùng và Quyền để có được Giá trị ID cho INSERTing. Không chắc chắn nơi làm gì để mà ...
Edit:
tài Bảng (ID, Tên đăng nhập) 1, John Smith 2, Mark Wahlerg
Vai trò Bảng (ID, RoleName) 1, quản trị viên 2, tài 3, khách
người dùng Role Bảng (User ID, Vai trò ID)
tôi muốn các SQL cho các lệnh MERGE để adju st bảng người dùng Role như vậy mà tôi có thể làm rõ một cái gì đó như:
USING(VALUES
('John Smith', 'Administrator'),
('Mark Wahlburg', 'User')
và nó sẽ tham gia để xác định các ID, chèn các kết hợp mà không tồn tại (và có thể xóa những cái mà làm, nhưng không phải là trong MERGE.
Giải pháp:
WITH CTE AS
(
SELECT UserId, RoleId
FROM (VALUES
('John Smith', 'Administrator'),
('Mark Wahlburg', 'User'))
AS SOURCE(UserName, RoleName)
INNER JOIN User ON SOURCE.UserName = User.UserName
INNER JOIN Role ON SOURCE.RoleName = Role.RoleName
)
MERGE INTO UserRole AS TARGET
USING CTE
ON CTE.UserId = TARGET.UserID AND CTE.RoleId = TARGET.UserId
WHEN NOT MATCHED BY TARGET THEN
INSERT(UserId, RoleId)
VALUES(UserId, RoleId)
Chỉ cần tò mò, tại sao bạn sử dụng MERGE ở đây thay vì đơn giản hơn 'INSERT ... SELECT'? Tôi không nói rằng bạn không thể làm điều này với 'MERGE' nhưng có vẻ như quá mức cho một hoạt động tầm thường như vậy. –
@AaronBertrand, đây là một ví dụ đơn giản, thông thường tôi có nhiều hàng và sử dụng các mức độ CẬP NHẬT và DELETE của MERGE. Tôi đã cố gắng cô lập vấn đề. – Rich
Vấn đề nằm trong mệnh đề 'USING' của bạn. Bạn chỉ có các giá trị mã hóa cứng ở đó; bạn cần nó để thực sự sử dụng 'SELECT' nếu bạn cần vẽ các giá trị đó từ một bảng. Ngoài ra còn có một số người khá thông minh có thể giúp giải quyết vấn đề của bạn, nhưng họ quan tâm nhiều hơn trong việc giải quyết vấn đề thực tế của bạn - rút xuống nó chỉ dẫn đến những câu hỏi không cần thiết như câu hỏi tôi đã hỏi. –