Ich bin mit der MERGE-Anweisung in einer Datenbank Projekt Referenzdaten von einem statischen Wert gesetzt, wie die unten folgenden bevölkern:SQL Server MERGE + Joining andere Tabellen
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);
Das Problem kommt, wenn ich will um die Sekundärtabelle basierend auf Inhalt in anderen Tabellen aufzufüllen. Zum Beispiel enthält meine UserPermission-Tabelle die Benutzer-ID und die Rollen-ID und ich möchte, dass mein statischer Wert auf etwas wie ('[email protected]', 'Admin') gesetzt ist und ich kann mich mit Benutzer und Erlaubnis verbinden ID-Werte für INSERT. Nicht sicher, wo das zu tun ...
Edit:
Benutzertabelle (ID, Benutzername) 1, John Smith 2, Mark Wahlerg
Rolle Tabelle (ID, Rolename) 1, Administrator 2, Benutzer 3, Gast
Benutzer-Rollen-Tabelle (Benutzer-ID, Rollen ID)
ich die SQL für die MERGE-Anweisung will ADJU st der Benutzer-Rollen-Tabelle so, dass ich so etwas angeben können:
USING(VALUES
('John Smith', 'Administrator'),
('Mark Wahlburg', 'User')
und es wird kommen Sie mit den IDs zu bestimmen, die Kombinationen einfügen, existiert nicht (und vielleicht auch diejenigen löschen, die tun, sind aber nicht in der MERGE.
Lösung:
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)
Nur neugierig, warum verwenden Sie MERGE hier anstelle einer viel einfacheren "INSERT ... SELECT"? Ich sage nicht, dass du das nicht mit "MERGE" machen kannst, aber es scheint übertrieben für solch eine triviale Operation. –
@AaronBertrand, dies ist ein einfaches Beispiel, normalerweise habe ich mehrere Zeilen und verwende die UPDATE- und DELETE-Fähigkeiten von MERGE. Ich habe versucht, das Problem zu isolieren. – Rich
Das Problem liegt in Ihrer 'USING'-Klausel. Du hast dort nur fest codierte Werte; Sie benötigen es, um ein SELECT zu verwenden, wenn Sie diese Werte aus einer Tabelle ziehen müssen. Außerdem gibt es einige schlaue Leute, die Ihnen helfen können, Ihre Probleme zu lösen, aber sie sind viel mehr daran interessiert, Ihr tatsächliches Problem zu lösen - es zu verdummen, führt nur zu unnötigen Fragen wie die, die ich gestellt habe. –