2012-05-09 11 views
8

私は下に次のような静的な値のセットからの参照データを、移入するデータベースプロジェクト内MERGE文を使用しています:SQL ServerのMERGE +参加、他のテーブル

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')のように設定し、ユーザーと権限に参加してINSERTのID値です。それにどこをやるかわからない...

編集:

ユーザー表(ID、ユーザ名) 1、ジョン・スミス 2、マークWahlerg

ロールテーブル(ID、ロール名) 1、管理者 2、ユーザー 3ゲスト

ユーザーロールテーブル(ユーザID、ロールID)

私はadjuにMERGE文のSQLをしたいですST私のようなものを指定行うことができるようなユーザー・ロール・テーブル:

USING(VALUES 
('John Smith', 'Administrator'), 
('Mark Wahlburg', 'User') 

をして、それは、IDを決定するために参加する存在いけない組み合わせを挿入します(多分やるものを削除しますが、ではないだろうマージで

ソリューション:

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

ちょっと不思議なことに、ずっと単純なINSERT ... SELECTの代わりにMERGEを使っているのはなぜですか?私はあなたが 'MERGE'でこれをすることができないと言っているわけではありませんが、そのような些細な操作のために残忍なようです。 –

+0

@AaronBertrand、これは単純な例ですが、通常は複数の行があり、MERGEのUPDATEおよびDELETE機能を使用します。私は問題を切り離そうとしていました。 – Rich

+0

問題はあなたの 'USING'節にあります。そこにハードコーディングされた値があります。テーブルからそれらの値を引き出す必要がある場合は、実際に 'SELECT'を使用する必要があります。あなたの問題を解決するのに役立つかなりスマートな人もいますが、あなたの実際の問題を解決することにもっと関心があります。私は尋ねたような不必要な質問につながります。 –

答えて

8

マージはので、おそらく、あなたの静的なデータを組み合わせて、任意のは、CTE内結合の実行、あなたのソースとしてこれを使用することができCTEをサポートしています。

+1

それはトリックでした。CTEとテーブル値のコンストラクタに関する私の経験は少し弱かったので、私はそれらをどこで(そして一緒に)使用できるのか分からなかった。 – Rich

関連する問題