Evitar duplicatas na consulta INSERT INTO SELECT no SQL Server

Eu tenho as duas tabelas a seguir:

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

Eu preciso inserir dados de Table1 para Table2 . Eu posso usar a seguinte syntax:

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

No entanto, no meu caso, IDs duplicados podem existir na Table2 (no meu caso, é apenas ” 1 “) e não quero copiar isso novamente, pois isso causaria um erro.

Eu posso escrever algo assim:

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

Existe uma maneira melhor de fazer isso sem usar IF - ELSE ? Eu quero evitar duas INSERT INTO-SELECT base em alguma condição.

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 

Das três opções, o LEFT JOIN/IS NULL é menos eficiente. Veja este link para mais detalhes .

No MySQL você pode fazer isso:

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

O SQL Server tem algo semelhante?

Acabei de ter um problema semelhante, a palavra-chave DISTINCT funciona como mágica:

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

Usando ignore Duplicates no índice exclusivo como sugerido por IanC aqui foi a minha solução para um problema semelhante, criando o índice com a opção WITH IGNORE_DUP_KEY

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

Ref .: index_option

Do SQL Server, você pode definir um índice de chave exclusivo na tabela para (colunas que precisam ser exclusivas)

Do SQL Server, clique com o botão direito do mouse no design da tabela, selecione Índices / Chaves

Selecione colunas que não serão duplicadas e digite Unique Key

Um pouco fora do tópico, mas se você quiser migrar os dados para uma nova tabela, e as possíveis duplicatas estiverem na tabela original , e a coluna possivelmente duplicada não for um id, um GROUP BY fará:

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