No SQL Server , é possível INSERT
entrar em uma tabela usando uma SELECT
instrução:
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
Também é possível atualizar via a SELECT
? Eu tenho uma tabela temporária contendo os valores e gostaria de atualizar outra tabela usando esses valores. Talvez algo parecido com isto:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
sql
sql-server
tsql
select
jamesmhaley
fonte
fonte
SET Table.other_table_id = @NewValue
), em seguida, alterar a instrução ON para algo comoON Table.id = @IdToEdit AND other_table.id = @NewValue
No SQL Server 2008 (ou melhor), use
MERGE
Alternativamente:
fonte
MERGE
também pode ser usado para registros "Upserting"; isto é,UPDATE
se existir um registro correspondente, umINSERT
novo registro se não for encontradoUPDATE
que asMERGE
pessoas aprenderam a viver com eles e se tornam parte da paisagem ('recursos'). Considere que não existiam blogs quandoUPDATE
era o garoto novo no quarteirão.fonte
SET Table_A.col1 = SUM(Table_B.col1)
(ou qualquer outra função agregada). Tão melhor que a resposta de Robin Day para esse fim.Eu modificaria a excelente resposta de Robin para o seguinte:
Sem uma cláusula WHERE, você afetará mesmo as linhas que não precisam ser afetadas, o que poderia (possivelmente) causar o recálculo do índice ou disparar disparos que realmente não deveriam ter sido disparados.
fonte
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2))
é mais conciso.Mão única
fonte
Outra possibilidade ainda não mencionada é apenas colocar a
SELECT
declaração em um CTE e atualizá-lo.Isso tem o benefício de que é fácil executar a
SELECT
instrução por conta própria primeiro para verificar os resultados, mas exige que você alias as colunas como acima, se elas tiverem o mesmo nome nas tabelas de origem e de destino.Isso também tem a mesma limitação que a
UPDATE ... FROM
sintaxe proprietária mostrada em quatro das outras respostas. Se a tabela de origem estiver do lado muitos de uma junção um para muitos, é indeterminado qual dos possíveis registros de junção correspondentes serão usados noUpdate
(um problema queMERGE
evita gerar um erro se houver uma tentativa de atualizar o mesma linha mais de uma vez).fonte
CTE
?;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
Para o registro (e outros pesquisando como eu), você pode fazê-lo no MySQL assim:
fonte
Usando alias:
fonte
A maneira simples de fazer isso é:
fonte
Esse pode ser um motivo de nicho para executar uma atualização (por exemplo, usada principalmente em um procedimento) ou pode ser óbvio para outras pessoas, mas também deve ser declarado que você pode executar uma instrução de seleção de atualização sem usar join (no caso de as tabelas que você está atualizando não têm um campo comum).
fonte
Aqui está outra sintaxe útil:
Ele verifica se é nulo ou não usando "WHERE EXIST".
fonte
Eu adiciono isso apenas para que você possa ver uma maneira rápida de escrevê-lo, para poder verificar o que será atualizado antes de fazer a atualização.
fonte
Se você usa o MySQL em vez do SQL Server, a sintaxe é:
fonte
ATUALIZAÇÃO de SELECT com INNER JOIN no banco de dados SQL
Como há muitas respostas deste post, que são mais votadas, pensei em fornecer minha sugestão aqui também. Embora a pergunta seja muito interessante, eu já vi em muitos sites de fórum e fiz uma solução usando o INNER JOIN com capturas de tela.
Inicialmente, criei uma tabela com o nome schoolold e inseri alguns registros com relação aos nomes das colunas e os executei.
Então eu executei o comando SELECT para visualizar os registros inseridos.
Em seguida, criei uma nova tabela nomeada com schoolnew e executei as ações acima da mesma forma.
Então, para visualizar os registros inseridos, eu executo o comando SELECT.
Agora, aqui eu quero fazer algumas alterações na terceira e quarta linha, para concluir esta ação, eu executo o comando UPDATE com INNER JOIN .
Para visualizar as alterações, eu executo o comando SELECT .
Você pode ver como os registros da tabela Terceira e Quarta schoolold facilmente substituído com mesa schoolnew usando INNER JOIN com a declaração UPDATE.
fonte
E se você quiser se juntar à mesa (o que não acontecerá com muita frequência):
fonte
targett1
e emsourcet1
vez de (ou também) comentários.O exemplo a seguir usa uma tabela derivada, uma instrução SELECT após a cláusula FROM, para retornar os valores antigos e novos para atualizações adicionais:
fonte
A atualização
CTE
é mais legível do que as outras respostas aqui:fonte
Se você estiver usando o SQL Server, poderá atualizar uma tabela da outra sem especificar uma associação e simplesmente vincular as duas da
where
cláusula. Isso torna uma consulta SQL muito mais simples:fonte
Consolidando todas as diferentes abordagens aqui.
A estrutura da tabela de amostra está abaixo e será atualizada de Product_BAK para a tabela Product.
produtos
Product_BAK
1. Selecione atualização
2. Atualize com uma expressão de tabela comum
3. Mesclar
Nesta declaração de mesclagem, podemos inserir, se não encontrar um registro correspondente no destino, mas existir na fonte e encontrar a sintaxe:
fonte
A outra maneira é usar uma tabela derivada:
Dados de amostra
fonte
Para garantir que você esteja atualizando o que deseja, selecione primeiro
fonte
Existe ainda um método mais curto e pode ser surpreendente para você:
Conjunto de dados de amostra:
Código:
fonte
Usar:
OU:
OU:
Se o nome da coluna de ID for o mesmo nas duas tabelas, basta colocar o nome da tabela antes da tabela a ser atualizada e usar um alias para a tabela selecionada, ou seja:
fonte
Na resposta aceita, após o:
Eu adicionaria:
O que eu costumo fazer é colocar tudo em uma transação com rollback e usar o
"OUTPUT"
: dessa maneira, vejo tudo o que está prestes a acontecer. Quando estou feliz com o que vejo, mudo oROLLBACK
interiorCOMMIT
.Normalmente, preciso documentar o que fiz, portanto, uso a
"results to Text"
opção ao executar a consulta com backup em rolo e salvo o script e o resultado da OUTPUT. (Claro que isso não é prático se eu alterar muitas linhas)fonte
fonte
A solução abaixo funciona para um banco de dados MySQL:
fonte
A outra maneira de atualizar a partir de uma instrução select:
fonte
Opção 1: Usando a junção interna:
Opção 2: Subconsulta relacionada à empresa
fonte
A sintaxe da instrução UPDATE ao atualizar uma tabela com dados de outra tabela no SQL Server
fonte
Você pode usar isso para atualização no servidor sql
fonte