que estoy usando la instrucción MERGE dentro de un proyecto de base de datos para rellenar los datos de referencia de un conjunto de valores estáticos, tales como las siguientes a continuación:SQL + unirse a otras tablas
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);
El problema viene cuando quiero para llenar la tabla secundaria en función del contenido en otras tablas. Por ejemplo, mi tabla UserPermission contiene ID de usuario e ID de rol y me gustaría que mi valor estático sea algo así como ('[email protected]', 'Admin') y poder unirme a Usuario y Permiso para obtener el Valores de ID para INSERTing. No sabe dónde hacer para que ...
Editar:
la tabla de usuario (ID, nombre de usuario) 1, John Smith 2, Mark Wahlerg
Papel Tabla (ID, NombreRol) 1, administrador 2, usuario 3 , Visitante
usuario Rol tabla (ID de usuario, ID del Rol)
quiero el SQL para la instrucción MERGE a ADJU st la mesa por el usuario Rol de tal manera que yo puedo hacer especifique algo como:
USING(VALUES
('John Smith', 'Administrator'),
('Mark Wahlburg', 'User')
y se unirá a la determinación de los ID, insertar las combinaciones que No existe (y tal vez eliminan los que lo hacen, pero no están en la FUSIÓN.
Solución:
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)
Simplemente curioso, ¿por qué estás usando MERGE aquí en lugar de un 'INSERT ... SELECT' mucho más simple? No digo que no puedas hacer esto con 'MERGE', pero parece excesivo para una operación tan trivial. –
@AaronBertrand, este es un ejemplo simplista, normalmente tengo varias filas y uso las capacidades de ACTUALIZAR y ELIMINAR de MERGE. Intentaba aislar el problema. – Rich
El problema está en su cláusula 'USING'. Simplemente tienes valores codificados allí; necesita que realmente esté usando un 'SELECCIONAR' si necesita dibujar esos valores desde una tabla. También hay algunas personas muy inteligentes que pueden ayudar a resolver sus problemas, pero están mucho más interesadas en resolver su problema real: simplificarlo solo genera preguntas innecesarias como la que yo pedí. –