Evite duplicados en la consulta INSERT INTO SELECT en SQL Server

Resuelto Ashish Gupta asked hace 14 años • 11 respuestas

Tengo las siguientes dos tablas:

Table1
----------
ID   Name
1    A
2    B
3    C

Table2
----------
ID   Name
1    Z

Necesito insertar datos de Table1a Table2. Puedo usar la siguiente sintaxis:

INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1

Sin embargo, en mi caso, es posible que existan ID duplicados Table2(en mi caso, es solo " 1") y no quiero copiarlos nuevamente, ya que eso arrojaría un error.

Puedo escribir algo como esto:

IF NOT EXISTS(SELECT 1 FROM Table2 WHERE Id=1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 
ELSE
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 WHERE Table1.Id<>1

¿Existe una mejor manera de hacer esto sin usar IF - ELSE? Quiero evitar dos INSERT INTO-SELECTdeclaraciones basadas en alguna condición.

Ashish Gupta avatar Mar 25 '10 12:03 Ashish Gupta
Aceptado

Usando NOT EXISTS:

INSERT INTO TABLE_2
  (id, name)
SELECT t1.id,
       t1.name
  FROM TABLE_1 t1
 WHERE NOT EXISTS(SELECT id
                    FROM TABLE_2 t2
                   WHERE t2.id = t1.id)

Usando NOT IN:

INSERT INTO TABLE_2
  (id, name)
SELECT t1.id,
       t1.name
  FROM TABLE_1 t1
 WHERE t1.id NOT IN (SELECT id
                       FROM TABLE_2)

Usando LEFT JOIN/IS NULL:

INSERT INTO TABLE_2
  (id, name)
   SELECT t1.id,
          t1.name
     FROM TABLE_1 t1
LEFT JOIN TABLE_2 t2 ON t2.id = t1.id
    WHERE t2.id IS NULL

De las tres opciones, la LEFT JOIN/IS NULLes menos eficiente. Vea este enlace para más detalles .

OMG Ponies avatar Mar 25 '2010 05:03 OMG Ponies

En MySQL puedes hacer esto:

INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1

¿SQL Server tiene algo similar?

Duncan avatar Mar 25 '2010 06:03 Duncan

Acabo de tener un problema similar, la palabra clave DISTINCT hace magia:

INSERT INTO Table2(Id, Name) SELECT DISTINCT Id, Name FROM Table1
Hunter Bingham avatar Jul 15 '2016 22:07 Hunter Bingham