SQL Server MERGE + Łączenie innych tabel
Używam instrukcji MERGE w projekcie bazy danych, aby zapełnić dane referencyjne ze statycznego zestawu wartości, takiego jak poniżej:
<code> 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); </code>
Problem pojawia się, gdy chcę zapełnić tabelę pomocniczą na podstawie zawartości w innych tabelach. Na przykład moja tabela UserPermission zawiera identyfikator użytkownika i identyfikator roli, a moja statyczna wartość jest ustawiona na coś podobnego („[email protected]”, „Admin”) i można dołączyć do użytkownika i uprawnień, aby uzyskać Wartości identyfikacyjne dla WSTAWIANIA. Nie wiem, gdzie to zrobić ...
Edytować:
Tabela użytkownika (ID, nazwa użytkownika) 1, John Smith 2, Mark Wahlerg
Tabela ról (identyfikator, nazwa roli) 1, administrator 2, użytkownik 3, gość
Tabela ról użytkownika (identyfikator użytkownika, identyfikator roli)
Chcę, aby instrukcja SQL dla korespondencji seryjnej dostosowała tabelę roli użytkownika, tak aby można było określić coś takiego:
<code>USING(VALUES ('John Smith', 'Administrator'), ('Mark Wahlburg', 'User') </code>
i połączy się, aby określić identyfikatory, wstawić kombinacje, które nie istnieją (i być może usunąć te, które to robią, ale nie znajdują się w MERGE.
Rozwiązanie:
<code>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) </code>