2012-05-09 34 views
8

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) 
+0

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

+0

@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

+0

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

Trả lời

8

Merge hỗ trợ CTEs vì vậy có lẽ bạn có thể sử dụng như là nguồn của bạn, kết hợp dữ liệu tĩnh của bạn và thực hiện bất kỳ tham gia trong CTE.

+1

Đó là mẹo.Kinh nghiệm của tôi với CTEs và các nhà xây dựng giá trị bảng là một chút yếu, do đó tôi không biết nơi họ có thể được sử dụng (và sử dụng cùng nhau). – Rich

Các vấn đề liên quan