2012-02-22 8 views
5

Quiero crear una combinación que comparar dos tablas e insertar los valores no coincidentes en otra tercera mesa o tabla de variables algo como esto:SQL fusionarse con la inserción en la otra mesa

MERGE Assets AS target 
USING (@id, @name)FROM Sales AS source (id, name) ON (target.id = SOURCE.id) 
WHEN MATCHED THEN 
    UPDATE SET target.Status = @status, target.DateModified = SYSUTCDATETIME() 
WHEN NOT MATCHED THEN 
    INSERT INTO @tableVar (id, name, status, dateModified) 
    VALUES (@id, @name, @status, SYSUTCDATETIME()) 

le ayudaría a chicos yo para transformarlo usando algunos otros constructos.

Respuesta

10

Usted solo no puede hacer esto. MERGE opera solo en dos tablas: fuente y destino.

Para su necesidad, necesita p. Ej. utilice un CTE (Common Table Expression) para buscar las filas que no coinciden, e inserte esas en la tercera tabla.

Algo así como:

;WITH NonMatchedData AS 
(
    -- adapt this as needed - just determine which rows match your criteria, 
    -- and make sure to return all the columns necessary for the subsequent INSERT 
    SELECT (columns) 
    FROM dbo.SourceTable 
    WHERE ID NOT IN (SELECT DISTINCT ID FROM dbo.TargetTable) 
) 
INSERT INTO dbo.ThirdTable(Col1, Col2, ....., ColN) 
    SELECT Col1, Col2, ....., ColN 
    FROM NonMatchedData 
+1

¿Hay una alternativa al 'NO EN 'en este caso? ¿Algo como un 'JOIN' que vuelve a juntar todas las filas que no pudieron 'JOIN'? Otro entonces 'LEFT JOIN' +' IS NULL'. Además, ¿es realmente necesario el CTE? ¿No puede él 'INSERTAR EN ThirdTable FROM SELECT NonMatchedData'? – Alexandre

+1

@PeekaySwitch: claro, pero entonces ** ESTÁS ** haciendo una 'UNIÓN EXTREMA IZQUIERDA' y comprobando que una columna del 'dbo.TargetTable' es' NULL' ... No veo qué otra opción haría estar allí, realmente ... –

+1

¿Sabes en la parte superior de tu cabeza qué ofrece mejores prestaciones? Esperaría que el 'LEFT OUTER JOIN' fuera más efectivo, pero tal vez estén juntos, siempre traté de evitar el uso de' NOT IN' con cantidades masivas de datos en 'Where' (como IDs) – Alexandre

2

Usted puede hacer esto con mucha facilidad ...

Usted puede envolver la instrucción MERGE dentro de un INSERT INTO DE:
http://technet.microsoft.com/en-us/library/bb510625.aspx#sectionToggle2

-O-

Puede hacerlo directamente en la declaración de combinación:

Ejemplo rápido:

WHEN NOT MATCHED THEN 
    DELETE 
OUTPUT Deleted.* INTO dbo.MyTable; 

Esto insertará los no partidos en su tabla de destino existente. Puede usar las tablas v actualizadas, insertadas y eliminadas para dirigir datos a otros lugares.

+0

Esto debe estar en una cláusula 'COINCIDIO' o 'NO COINCIDIDO POR ORIGEN', pero funciona bien. –

Cuestiones relacionadas