solo repetidos registros mostrar menos evitar eliminar duplicados dejando contar campos agrupar sql sql-server tsql sql-insert

repetidos - sql eliminar registros duplicados menos uno



Evite duplicados en la consulta INSERT INTO SELECT en SQL Server (6)

Tengo las siguientes dos tablas:

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

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

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

Sin embargo, en mi caso, los ID duplicados pueden existir en la Table2 (en mi caso, es solo " 1 ") y no quiero copiar eso nuevamente ya que 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

¿Hay una mejor manera de hacerlo sin usar IF - ELSE ? Quiero evitar dos INSERT INTO-SELECT basadas en alguna condición.


Acabo de tener un problema similar, la palabra clave DISTINCT funciona mágica:

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


Desde SQL Server puede establecer un índice de clave única en la tabla para (Columnas que debe ser única)


El uso de ignore Duplicates en el índice único como lo sugiere IanC aquí fue mi solución para un problema similar, creando el índice con la opción WITH IGNORE_DUP_KEY

In backward compatible syntax , WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.

Ref .: index_option


En MySQL puedes hacer esto:

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

¿SQL Server tiene algo similar?


Un poco fuera del tema, pero si quieres migrar los datos a una nueva tabla, y los posibles duplicados están en la tabla original , y la columna posiblemente duplicada no es una identificación, un GROUP BY hará:

INSERT INTO TABLE_2 (name) SELECT t1.name FROM TABLE_1 t1 GROUP BY t1.name


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)

Usar 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, LEFT JOIN/IS NULL es menos eficiente. Vea este enlace para más detalles .