2012-05-09 13 views
8

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) 
+0

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. –

+0

@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

+0

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í. –

Respuesta

8

Merge apoya CTE así que tal vez puede utilizar esto como su fuente, la combinación de sus datos estáticos y realizar cualquier une dentro del cte.

+1

Ese fue el truco.Mi experiencia con CTE y constructores de valores de tabla fue un poco débil, por lo tanto, no sé dónde se pueden usar (y usar juntos). – Rich

Cuestiones relacionadas