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
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 .