Evite duplicados en la consulta INSERT INTO SELECT en SQL Server
Tengo las siguientes dos tablas:
Table1
----------
ID Name
1 A
2 B
3 C
Table2
----------
ID Name
1 Z
Necesito insertar datos de Table1
a 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-SELECT
declaraciones basadas en alguna condición.
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 NULL
es menos eficiente. Vea este enlace para más detalles .
En MySQL puedes hacer esto:
INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1
¿SQL Server tiene algo similar?
Acabo de tener un problema similar, la palabra clave DISTINCT hace magia:
INSERT INTO Table2(Id, Name) SELECT DISTINCT Id, Name FROM Table1