2010-02-18 32 views
14

Estoy creando un procedimiento almacenado que va a insertar filas en una tabla de 'puesta en escena' con una inserción en + sub consulta de este modo:inserción SQL condicional si la fila no existe ya

INSERT INTO myStagingTable 
SELECT col1, col2, col3 
FROM myRealTable 

tengo que poner una condicional allí de alguna manera para determinar si el valor de col1, por ejemplo, ya existe en myStagingTable, y luego no lo inserte, simplemente omita esa fila de myRealTable.

¿Esto es posible? Si es así, ¿cómo estructuraría eso?

TIA

Respuesta

16
INSERT 
INTO myStagingTable 
SELECT col1, col2, col3 
FROM myRealTable rt 
WHERE NOT EXISTS 
     (
     SELECT rt.col1, rt.col2, rt.col3 
     INTERSECT 
     SELECT col1, col2, col3 
     FROM myStagingTable 
     ) 

Este se encargará de todos los duplicados (incluyendo NULL)

nota que se va a insertar los duplicados de la mesa real es ninguna. Dicen que si la mesa real contiene

1 1 1 
1 1 1 

y la tabla de ensayo contiene

2 2 2 

, se insertarán los dos registros con 1, 1, 1.

Si desea eliminar los duplicados en el inserto (de modo que sólo una instancia de 1, 1, 1 se inserta), a continuación, sólo tiene que utilizar esto:

INSERT 
INTO myStagingTable 
SELECT col1, col2, col3 
FROM myRealTable 
EXCEPT 
SELECT col1, col2, col3 
FROM myStagingTable 
+0

¿No debería especificar las columnas seleccionadas en ambos lados de la INTSERSECT ¿cláusula? ¿Qué pasa si hay cuatro cols en myRealTable? –

+0

@Philip: claro, solo estaba corrigiendo esto :) – Quassnoi

+0

Parece que INTERSECT y EXCEPTO no son compatibles con SQL2000 ... – jiaoziren

Cuestiones relacionadas