2011-06-17 8 views
5

La base de datos es SQL Server 2008. Tengo una consulta que extrae filas de una o más tablas y luego intenta insertarlas en una variable de tabla.Prevención de insertos de tabla duplicados

me gustaría una manera eficiente para prevenir inserciones duplicados, así que lo que ocurrió fue:

INSERT INTO @MyTableVariable 
SELECT SomeID 
FROM SomeTable st 
INNER JOIN SomeOtherTable sot ON sot.SomeID = st.SomeID 
LEFT JOIN @MyTableVariable t ON t.SomeID = sot.SomeID 
WHERE t.SomeID IS NULL 

Esto, sin embargo, no parece prevenir inserciones duplicadas en ciertos escenarios.

Parece como si (y esto tiene sentido si lo piensa y mira el plan de consulta) que solo se utiliza el "estado" inicial de @MyTableVariable en la operación de unión izquierda. En otras palabras, esto evitaría duplicados si @MyTableVariable ya tenía SomeID allí antes de ejecutar esta instrucción, pero no evitaría duplicados si FROM/INNER JOIN en SomeTable/SomeOtherTalbe generaba SomeID duplicados.

Además de simplemente presionar un DISTINCT en la instrucción SELECT, ¿hay alguna otra manera más eficiente de manejar esto?

+0

Si no desea hacer un 'DISTINCT' o un' GROUP BY', entonces podría crear un índice único en su columna e ignorar las claves duplicadas. – Lamak

+0

¿Cómo hace para ignorar los errores clave duplicados? ¿Y esto es realmente más rápido que realizar lo distinto? – RMD

Respuesta

3

Por lo que yo sé, no hay manera de INSERT IGNORE o INSERT ON DUPLICATE KEY en SQL Server . Hay es MERGE, por supuesto, pero no resolvería su problema, porque se comportaría igual que su INSERT, es decir, generaría una excepción.

¿Hay otra forma más eficiente de manejar esto?

En mi opinión, las opciones son:

  1. intento de encontrar una forma más específica de filtrado/unirse a fin de no producir duplicados.

  2. 'Slap' DISTINCT en algún lugar en una etapa anterior a fin de evitar que los duplicados entren en cualquiera de las tablas que se unen en primer lugar.

  3. Transforme la (s) tabla (s) primariamente responsables de producir duplicados, en subselecciones con DISTINCT aplicadas localmente.

Si no puede producir un conjunto de resultados sin duplicados, tendrá que pagar (rendimiento) para eliminar posibles duplicados. Sea lo que sea, DISTINCT, o GROUP BY, o tal vez funciones de clasificación, induciría a una cierta penalización de rendimiento, y usted debería simplemente aceptar el hecho.

0

Debe crear la clave en la columna de identificación de la variable de la tabla.

declaran así:

declare @MyTableVariable table(SomeID int identity(1,1) primary key) 

Esta clave principal evitará inserción duplicado

Esperanza esto ayuda

+0

Mi variable de tabla ya tiene una clave principal especificada.No estoy preguntando cómo evitar duplicados en general, estoy preguntando cómo optimizar el rendimiento de mi consulta sin tener que restaurar a una cláusula distinta que causa una operación de clasificación completa. – RMD

Cuestiones relacionadas