Evitar uso de NOT IN para ingreso de data en tabla

18/06/2009 - 18:56 por Firefox | Informe spam
Hola tengo una rutina donde parar grabar los codigos en una tabla debo
comprobar que estos ya no existan, por ejemplo:

INSERT INTO TABLA SELECT CODIGO FROM TABLA2 WHERE TABLA.COD NOT IN
(SELECT CODIGO FROM TABLA2)

como se puede evitar el uso del NOT IN para lograr el mismo
cometido ? . Muchas Gracias a Todos por anticipado (^_^)

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera
18/06/2009 - 19:22 | Informe spam
Si usted desea evitar que se inserten en TABLA valores existentes de codigos
usted puede crear un indice UNIQUE para la columna codigo de TABLA.

De esa forma, si se intenta insertar un valor duplicado, obtendrá un rechazo
por violar unicidad.

Gustavo Larriera, Microsoft MVP
http://www.linkedin.com/in/gustavolarriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Firefox" wrote:

Hola tengo una rutina donde parar grabar los codigos en una tabla debo
comprobar que estos ya no existan, por ejemplo:

INSERT INTO TABLA SELECT CODIGO FROM TABLA2 WHERE TABLA.COD NOT IN
(SELECT CODIGO FROM TABLA2)

como se puede evitar el uso del NOT IN para lograr el mismo
cometido ? . Muchas Gracias a Todos por anticipado (^_^)

Respuesta Responder a este mensaje
#2 Gustavo Larriera
18/06/2009 - 19:23 | Informe spam
Si usted desea evitar que se inserten en TABLA valores existentes de codigos
usted puede crear un indice UNIQUE para la columna codigo de TABLA.

De esa forma, si se intenta insertar un valor duplicado, obtendrá un rechazo
por violar unicidad.

Gustavo Larriera, Microsoft MVP
http://www.linkedin.com/in/gustavolarriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Firefox" wrote:

Hola tengo una rutina donde parar grabar los codigos en una tabla debo
comprobar que estos ya no existan, por ejemplo:

INSERT INTO TABLA SELECT CODIGO FROM TABLA2 WHERE TABLA.COD NOT IN
(SELECT CODIGO FROM TABLA2)

como se puede evitar el uso del NOT IN para lograr el mismo
cometido ? . Muchas Gracias a Todos por anticipado (^_^)

Respuesta Responder a este mensaje
#3 Alejandro Mesa
18/06/2009 - 20:12 | Informe spam
Ademas de lo dicho por Gustavo, pudieras usar uno de estos metodos.

INSERT INTO TABLA SELECT CODIGO FROM TABLA2 WHERE TABLA.COD NOT IN
(SELECT CODIGO FROM TABLA2)



INSERT INTO TABLA(codigo)
SELECT CODIGO
FROM TABLA2 as t2
WHERE not exists (
select *
from tabla as t1
where t1.codigo = t2.codigo
);

Esta sentencia no toma en cuenta que en la tabla [TABLA2] hallan codigos
duplicados, para lo cual puedes usar:

;with r_set
as
(
select codigo, row_number() over(partition by codigo order by (select 1)) as
rn
from TABLA2
)
INSERT INTO TABLA(codigo)
SELECT CODIGO
FROM r_set as t2
WHERE t2.rn = 1 and not exists (
select *
from tabla as t1
where t1.codigo = t2.codigo
);
GO

Tambien puedes adicionar una opcion al indice que usa SQL Server para
implementar una restriccion UNIQUE, y es "IGNORE_DUP_KEY = ON". En cuyo
caso, cualquier fila duplicada no sera insertada, sin dar error.

Ejemplo:

DECLARE @t1 TABLE (
c1 INT NOT NULL UNIQUE
);

DECLARE @t2 TABLE (
c1 INT NOT NULL
);

INSERT INTO @t1(c1) VALUES(2);

INSERT INTO @t2(c1) VALUES(1);
INSERT INTO @t2(c1) VALUES(1);
INSERT INTO @t2(c1) VALUES(2);

WITH r_set
AS
(
SELECT c1, ROW_NUMBER() OVER(PARTITION BY c1 ORDER BY (SELECT 1)) AS rn
FROM @t2
)
INSERT INTO @t1 (c1)
SELECT c1
FROM r_set AS t2
WHERE t2.rn = 1 AND NOT EXISTS (SELECT * FROM @t1 AS t1 WHERE t1.c1 = t2.c1);

SELECT *
FROM @t1;
GO

DECLARE @t1 TABLE (
c1 INT NOT NULL UNIQUE WITH (IGNORE_DUP_KEY = ON)
);

DECLARE @t2 TABLE (
c1 INT NOT NULL
);

INSERT INTO @t2(c1) VALUES(1);
INSERT INTO @t2(c1) VALUES(1);
INSERT INTO @t2(c1) VALUES(2);

INSERT INTO @t1 (c1)
SELECT c1
FROM @t2;

SELECT *
FROM @t1;
GO


AMB





"Firefox" wrote:

Hola tengo una rutina donde parar grabar los codigos en una tabla debo
comprobar que estos ya no existan, por ejemplo:

INSERT INTO TABLA SELECT CODIGO FROM TABLA2 WHERE TABLA.COD NOT IN
(SELECT CODIGO FROM TABLA2)

como se puede evitar el uso del NOT IN para lograr el mismo
cometido ? . Muchas Gracias a Todos por anticipado (^_^)

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida