2011-06-08 19 views
5

Tengo el T-SQL que se muestra a continuación. @Results es una variable de tabla y 'CTE' es una expresión de tabla común. Solo quiero insertar filas en la tabla @Results si el SubId que voy a insertar aún no se ha insertado en la tabla. El código que se muestra a continuación no hace el trabajo y no estoy seguro de por qué. ¿Alguien puede ver el problema?T-SQL: inserte una fila en una tabla solo si no existe

Insert Into @Results (
    Cell, 
    CellSettings, 
    RecipeInstanceId, 
    BiasStartTime, 
    SubId 
    RuleInstanceId) 
Select 
    Cell, 
    CellSettings, 
    RecipeInstanceId, 
    BiasStartTime, 
    SubId, 
    RuleInstanceId 
From CTE 
Where CTE.SubId NOT IN (Select SubId From @Results) 
+1

¿cuál es el problema? ¿Mensaje de error? – user492238

+0

puede que tenga que publicar también la cte, o incluso mejor: reducirla a una demostración más pequeña. Tu problema incluso se resuelve al hacerlo ...;) – user492238

+0

¿Recibes un mensaje de error al agregar un duplicado? – Sung

Respuesta

6

Es necesario comprobar de primera existencia:

IF NOT EXISTS(SELECT * FROM @Results WHERE SubId = .......) 
    INSERT INTO @Results (Cell, CellSettings, RecipeInstanceId, 
          BiasStartTime, SubId, RuleInstanceId) 
    SELECT 
     Cell, CellSettings, RecipeInstanceId, 
     BiasStartTime, SubId, RuleInstanceId 
    FROM CTE 

Tal vez usted podría poner este requisito (sólo devolver las filas que no existen aún) en su CTE modo que usted no tendrá para filtrar la salida de la CCMA una vez más ...

+1

¿No es mejor usar una unión? – Hogan

+0

@Hogan: no, ¿por qué? ¿Qué crees que puedes ganar usando un JOIN en su lugar? –

+0

porque esta comprobación debe realizarse para cada fila (una nueva selección) donde una combinación está optimizada en SQL para trabajar rápidamente en conjuntos de fechas. Es la diferencia entre O (n) optimizado frente a O (1) + O (1) + ... + O (1) n veces. (Consulte mi respuesta para ver un ejemplo del uso de la unión.) – Hogan

0

Compruebe si el registro existe o no el uso de "existe"

If Not Exists(Select SubId From @Results) 
    Insert Into @Results (
     Cell, 
     CellSettings, 
     RecipeInstanceId, 
     BiasStartTime, 
     SubId 
     RuleInstanceId) 
    Select 
     Cell, 
     CellSettings, 
     RecipeInstanceId, 
     BiasStartTime, 
     SubId, 
     RuleInstanceId 
    From CTE 
    Where CTE.SubId NOT IN (Select SubId From @Results) 
2

lo haría así (supuesto - que no tienen SubID duplicado en su CTE, es decir inserta SubID de X y luego más adelante en esta misma consulta se inserta el mismo.)

WITH CTE AS 
( 
    blah 
), CTENEW AS 
(
    SELECT CTE.* 
    FROM CTE 
    LEFT JOIN @Results R ON CTE.SubID = R.SubID 
    WHERE R.SubID IS NULL 
) 
Insert Into @Results (
    Cell, 
    CellSettings, 
    RecipeInstanceId, 
    BiasStartTime, 
    SubId 
    RuleInstanceId) 
Select 
    Cell, 
    CellSettings, 
    RecipeInstanceId, 
    BiasStartTime, 
    SubId, 
    RuleInstanceId 
From CTENEW 

O podrías enrollar la unión que hice en tu CTE.

1

probar un `cláusula de excepción:

insert MyTable(c1, c2, c3) 

select ot.c1, ot.c2, ot.c3 
from OtherTable ot 

except 

select mt.c1, mt.c2, mt.c3 
from MyTable 
Cuestiones relacionadas