我使用一個數據庫項目中的MERGE語句來填充從一個靜態值設定的基準數據,如下面的以下內容:SQL Server合併+加入其他表
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);
的問題出現時,我想根據其他表中的內容填充輔助表。例如,我的UserPermission表包含用戶ID和角色ID,我希望將我的靜態值設置爲('[email protected]','Admin'),並且能夠加入User和Permission以獲得INSERTing的ID值。不知道在哪裏做的是...
編輯:
用戶表(ID,用戶名) 1,約翰·史密斯 2,馬克Wahlerg
角色表(ID,角色名) 1,管理員 2,用戶 3,客戶
用戶角色表(用戶ID,角色ID)
我想要對MERGE語句SQL來adju ST的用戶角色表,這樣我可以不指定類似:
USING(VALUES
('John Smith', 'Administrator'),
('Mark Wahlburg', 'User')
,這將加入到確定的ID,插入不存在(也許刪除做的那些組合,但不在MERGE中。
解決方案:
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)
只是好奇,爲什麼你在這裏使用MERGE而不是一個簡單得多的'INSERT ... SELECT'?我並不是說你不能用MERGE來做到這一點,但對於這樣一個微不足道的操作來說似乎過度。 –
@AaronBertrand,這是一個簡單的例子,通常我有多行並使用MERGE的UPDATE和DELETE功能。我試圖隔離問題。 – Rich
問題出在你的'USING'子句中。你只有硬編碼的值,如果您需要從表中繪製這些值,則需要使用「SELECT」。也有一些非常聰明的人可以幫助解決你的問題,但他們更感興趣的是解決你的實際問題 - 貶低它只會導致像我問的那些不必要的問題。 –