Eu tenho as duas tabelas a seguir:
Table1
----------
ID Name
1 A
2 B
3 C
Table2
----------
ID Name
1 Z
Preciso inserir dados de Table1
para Table2
. Posso usar a seguinte sintaxe:
INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1
No entanto, no meu caso, podem existir IDs duplicados em Table2
(no meu caso, é apenas " 1
") e não quero copiá- los novamente, pois isso geraria um erro.
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.Id<>1
Existe uma maneira melhor de fazer isso sem usar IF - ELSE
? Quero evitar duas INSERT INTO-SELECT
declarações com base em alguma condição.
sql
sql-server
tsql
sql-insert
Ashish Gupta
fonte
fonte
NOT EXISTS
é especialmente útil com chave primária composta,NOT IN
não funcionará entãoNo MySQL, você pode fazer isso:
O SQL Server tem algo semelhante?
fonte
Acabei de ter um problema semelhante, a palavra-chave DISTINCT funciona como mágica:
fonte
insert into
tabela.Eu estava enfrentando o mesmo problema recentemente ...
Aqui está o que funcionou para mim no MS SQL Server 2017 ...
A chave primária deve ser definida no ID na tabela 2 ...
As colunas e propriedades da coluna devem ser as mesmas, é claro, entre os dois tabelas. Isso funcionará na primeira vez que você executar o script abaixo. O ID duplicado na tabela 1, não irá inserir ...
Se você executá-lo pela segunda vez, obterá um
Este é o código:
fonte
Usando
ignore Duplicates
o índice exclusivo, conforme sugerido pelo IanC, aqui estava minha solução para um problema semelhante, criando o índice com a opçãoWITH IGNORE_DUP_KEY
Ref .: index_option
fonte
No SQL Server, você pode definir um índice de chave exclusivo na tabela para (colunas que precisam ser exclusivas)
fonte
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á:fonte
Um simples
DELETE
antes doINSERT
seria suficiente:Alternar
Table1
paraTable2
dependendo de qual mesaId
ename
emparelhamento você deseja preservar.fonte