2012-05-09 69 views
8

我使用一個數據庫項目中的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) 
+0

只是好奇,爲什麼你在這裏使用MERGE而不是一個簡單得多的'INSERT ... SELECT'?我並不是說你不能用MERGE來做到這一點,但對於這樣一個微不足道的操作來說似乎過度。 –

+0

@AaronBertrand,這是一個簡單的例子,通常我有多行並使用MERGE的UPDATE和DELETE功能。我試圖隔離問題。 – Rich

+0

問題出在你的'USING'子句中。你只有硬編碼的值,如果您需要從表中繪製這些值,則需要使用「SELECT」。也有一些非常聰明的人可以幫助解決你的問題,但他們更感興趣的是解決你的實際問題 - 貶低它只會導致像我問的那些不必要的問題。 –

回答

8

Merge支持的CTE所以也許你可以用這個作爲源,結合您的靜態數據,並執行任何的CTE內加入。

+1

這就是訣竅。我在CTE和表值構造方面的經驗有點弱,因此我不知道他們可以在哪裏使用(並且一起使用)。 – Rich