私は下に次のような静的な値のセットからの参照データを、移入するデータベースプロジェクト内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)
ちょっと不思議なことに、ずっと単純なINSERT ... SELECTの代わりにMERGEを使っているのはなぜですか?私はあなたが 'MERGE'でこれをすることができないと言っているわけではありませんが、そのような些細な操作のために残忍なようです。 –
@AaronBertrand、これは単純な例ですが、通常は複数の行があり、MERGEのUPDATEおよびDELETE機能を使用します。私は問題を切り離そうとしていました。 – Rich
問題はあなたの 'USING'節にあります。そこにハードコーディングされた値があります。テーブルからそれらの値を引き出す必要がある場合は、実際に 'SELECT'を使用する必要があります。あなたの問題を解決するのに役立つかなりスマートな人もいますが、あなたの実際の問題を解決することにもっと関心があります。私は尋ねたような不必要な質問につながります。 –