11

データベースプロジェクト内でMERGEステートメントを使用して、次のような静的な値セットから参照データを入力しています。

    MERGE INTO dbo.[User] AS TARGET
USING (VALUES
    ('me@somewhere.com', '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が含まれていて、静的な値を('me@somewhere.com'、'Admin')のように設定し、UserandPermissionに参加してINSERTのID値。どこに行けばいいのかわからない...

編集:

ユーザーテーブル(ID、ユーザー名)1、John Smith 2、Mark Wahlerg

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

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

MERGEステートメントのSQLで、次のような指定ができるようにUser-Roleテーブルを調整する必要があります。

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)
4

1 に答える 1

10

MergeはCTEをサポートしているため、これをソースとして使用して、静的データを結合し、CTE内で任意の結合を実行できます。

于 2012-05-09T19:58:30.890 に答える