2012-02-15 14 views
5

así que tengo esta tabla temporal que tiene estructura como:SQL insertar en el uso de la Unión debe agregar sólo valores distintos

col1 col2 col3 col3 
intID1 intID2 intID3 bitAdd 

que estoy haciendo una unión de los valores de esta tabla temporal con una consulta de selección y almacenamiento de en la misma tabla temporal. Lo que pasa es que col3 no es parte de la consulta de unión. Lo voy a necesitar para actualizar la tabla.

Así que estoy haciendo de este modo:

Insert into #temptable 
(
intID1, 
intID2, 
intID3 
) 
select intID1,intID2,intID3 
From 
#temptable 

UNION 

select intID1,intID2,intID3 
From 
Table A 

Problema es que quiero sólo las filas que no están ya existente en la tabla temporal para ser added.Doing esta manera se sumará un duplicado de la ya fila existente (dado que union devolverá una fila) ¿Cómo inserto solo aquellas filas que no existen en la tabla temporal actual en mi consulta de unión?

Respuesta

7

bonito y sencillo con EXCEPT

INSERT INTO #temptable (intID1, intID2, intID3) 
SELECT intID1,intID2,intID3 FROM TableA 
EXCEPT 
SELECT intID1,intID2,intID3 FROM #temptable 
+0

gracias funcionó muy bien! – user1212140

9

Uso MERGE:

MERGE INTO #temptable tmp 
USING (select intID1,intID2,intID3 From Table A) t 
ON (tmp.intID1 = t.intID1 and tmp.intID2 = t.intID2 and tmp.intID3 = t.intID3) 
WHEN NOT MATCHED THEN 
INSERT (intID1,intID2,intID3) 
VALUES (t.intID1,t.intID2,t.intID3) 
+0

gracias por su respuesta, sin embargo el servidor sql La versión utilizada por nosotros es 2005. No pude usar esa palabra clave. – user1212140

0

veo donde está viniendo. En la mayoría de los lenguajes de programación #temptable habría una variable (una variable de relación o relvar para abreviar) a la cual le asigna un valor (un valor de relación) así:

#temptable := #temptable UNION A 

en el modelo relacional, esto sería lograr el resultado deseado porque una relación no tiene filas duplicadas por definición.

Sin embargo, SQL no es realmente relacional y no admite la asignación. En su lugar, debe agregar filas a una tabla mediante sentencias SQL DML INSERT (lo cual no es tan malo: los usuarios de un lenguaje de base de datos verdaderamente relacional, si tuviéramos uno, sin duda exigirían una taquigrafía similar para la asignación relacional). también se requiere que hagas la prueba de duplicados tú mismo.

Las respuestas de Daniel Hilgarth y Joachim Isaksson se ven bien. Es una buena práctica tener dos buenas respuestas candidatas lógicamente sólidas y luego buscar los criterios (generalmente el rendimiento bajo carga típica) para eliminar uno (pero retenerlo comentado para futuras pruebas)

+0

tat ¡es cierto gracias! – user1212140

Cuestiones relacionadas