Atualizar várias colunas no SQL

166

Existe uma maneira de atualizar várias colunas no SQL server da mesma maneira que uma instrução de inserção é usada?

Algo como:

Update table1 set (a,b,c,d,e,f,g,h,i,j,k)=
(t2.a,t2.b,t2.c,t2.d,t2.e,t2.f,t2.g,t2.h,t2.i,t2.j,t2.k)
from table2 t2
where table1.id=table2.id

Ou algo assim, e não assim:

update table set a=t2.a,b=t2.b etc 

o que pode ser bastante cansativo de escrever se você tiver mais de 100 colunas.

Joe
fonte
que soa bastante propenso a erros
AD7six
Se você estiver fazendo isso de forma programática, use consultas parametrizadas e você só precisará escrevê-lo uma vez. Se você estiver fazendo isso manualmente, use o editor do SQL Management Studio e insira os dados diretamente na linha, em vez de escrever uma consulta.
precisa saber é o seguinte

Respostas:

89

A "maneira cansativa" é o SQL padrão e como o RDBMS convencional faz isso.

Com mais de 100 colunas, você provavelmente tem um problema de design ... além disso, existem métodos de mitigação nas ferramentas do cliente (por exemplo, instruções UPDATE de geração) ou usando ORMs

gbn
fonte
5
Portanto, não há outra maneira de fazer isso no MSSQL?
Joe
4
@ Joe: não. Veja a resposta de Alex K abaixo ( stackoverflow.com/a/9079904/27535 ), existe um pedido para a MS adicioná-lo
gbn
eu acho que use 1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]"
DeLe
Concordo. problema de projeto em termos gerais, mas há circunstâncias em que a validação em massa / limpeza de dados pode ser necessária. Atualmente, estou envolvido nesse processo e, no SQL Server 2012, agora você pode atualizar mais de uma coluna por resposta de @John Woo abaixo.
Hilary
201

Tente o seguinte:

UPDATE table1 
SET a = t2.a, b = t2.b, .......
FROM table2 t2
WHERE table1.id = t2.id

Isso deve funcionar na maioria dos dialetos SQL, excluindo o Oracle.

E sim - é muita digitação - é a maneira como o SQL faz isso.

marc_s
fonte
4
Isso não funcionará no Oracle: docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
Rafał
16
Oi. Você está certo, mas eu só queria afirmar que não funcionará em nenhum dialeto SQL.
Rafał 27/06
3
Funciona no MySQL.
João Farias
19

Sua consulta está quase correta. O T-SQL para isso é:

UPDATE  Table1
SET     Field1 = Table2.Field1,
        Field2 = Table2.Field2,
        other columns...
FROM    Table2
WHERE   Table1.ID = Table2.ID
John Woo
fonte
Eu suspeito que o OP apenas tenha usado um alias vagamente, porque a pergunta não é sobre a correção da sintaxe, mas "por que" essa sintaxe. Pessoalmente, prefiro usar aliases como fiz aqui: stackoverflow.com/a/982947/27535
gbn
17

Sintaxe

UPDATE table-name 
SET column-name = value, column-name = value, ...
WHERE condition

Exemplo

UPDATE school
SET course = 'mysqli', teacher = 'Tanzania', student = 'you'
WHERE id = 6
betrice mpalanzi
fonte
8
   UPDATE t1 
    SET 
    t1.a = t2.a,
    t1.b = t2.b,
    .
    .
    .


    FROM 
    table1 t1 
    INNER JOIN table2 t2 ON  t1.id=t2.id

Você pode tentar isso

Thangamani Palanisamy
fonte
4

Eu tentei com este caminho e está funcionando bem:

UPDATE 
  Emp
SET 
  ID = 123, 
  Name = 'Peter' 
FROM 
  Table_Name
Peter
fonte
Isso parece funcionar bem na minha instalação do PostgreSQL 12.2 (testada usando o DBeaver).
Telmo Trooper
1

aqui está um que funciona:

UPDATE  `table_1`
INNER JOIN 
 `table_2` SET  col1= value, col2= val,col3= val,col4= val;

value é a coluna da tabela_2

Dragos Custura
fonte
1

Se você precisar digitar isso várias vezes, faça como eu fiz uma vez. Coloque os nomes das suas colunas em linhas na planilha do Excel (anote no final de cada nome de coluna (=), fácil no bloco de notas ++) no lado direito, crie uma coluna para copiar e colar seu valor que corresponderá às novas entradas em cada coluna. À direita deles, em uma coluna independente, coloque as vírgulas conforme

Então você terá que copiar seus valores para a coluna do meio de cada vez, basta colar e executar

Não conheço uma solução mais fácil

Mohamed Bekheit
fonte
0

Gostaria de compartilhar com você como abordo esse tipo de pergunta. Meu caso é um pouco diferente, pois o resultado da tabela2 é dinâmico e os números das colunas podem ser menores que os da tabela1. Mas o conceito é o mesmo.

Primeiro, obtenha o resultado da tabela2.

insira a descrição da imagem aqui

Em seguida, desative-o.

insira a descrição da imagem aqui

Em seguida, escreva a consulta de atualização usando SQL dinâmico. O código de amostra é escrito para testar 2 tabelas simples - tblA e tblB

--CREATE TABLE tblA(id int, col1 VARCHAR(25), col2 VARCHAR(25), col3 VARCHAR(25), col4 VARCHAR(25))
--CREATE TABLE tblB(id int, col1 VARCHAR(25), col2 VARCHAR(25), col3 VARCHAR(25), col4 VARCHAR(25))
--INSERT INTO tblA(id, col1, col2, col3, col4)
--VALUES(1,'A1','A2','A3','A4')
--INSERT INTO tblB(id, col1, col2, col3, col4)
--VALUES(1,'B1','B2','B3','B4')

DECLARE @id VARCHAR(10) = 1, @TSQL NVARCHAR(MAX)
DECLARE @tblPivot TABLE(    
    colName VARCHAR(255),
    val VARCHAR(255)
)

INSERT INTO @tblPivot
SELECT colName, val
FROM tblB
UNPIVOT
(
    val
    FOR colName IN (col1, col2, col3, col4)
) unpiv
WHERE id = @id

SELECT @TSQL = COALESCE(@TSQL + '''
,','') + colName + ' = ''' + val
FROM @tblPivot

SET @TSQL = N'UPDATE tblA
SET ' + @TSQL + ''' 
WHERE id = ' + @id
PRINT @TSQL
--EXEC SP_EXECUTESQL @TSQL

PRINT @TSQL resultado:

insira a descrição da imagem aqui

Weihui Guo
fonte
-3

Eu fiz isso no MySql e ele atualizou várias colunas em um único registro, então tente isso se você estiver usando o MySql como seu servidor:

"UPDATE creditor_tb SET credit_amount='" & CDbl(cur_amount) & "'
                   , totalamount_to_pay='" & current_total & "',   
        WHERE credit_id='" & lbcreditId.Text & "'". 

No entanto, eu estava codificando no vb.net usando o servidor MySql, mas você pode levá-lo para a sua linguagem de programação favorita, desde que você esteja usando o MySql como seu servidor.

Michael Kisingi
fonte
-4
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

http://www.w3schools.com/sql/sql_update.asp

Mellad Qarizada
fonte
2
Isso é apenas uma repetição das respostas existentes.
Pang
-8
update T1
set T1.COST2=T1.TOT_COST+2.000,
T1.COST3=T1.TOT_COST+2.000,
T1.COST4=T1.TOT_COST+2.000,
T1.COST5=T1.TOT_COST+2.000,
T1.COST6=T1.TOT_COST+2.000,
T1.COST7=T1.TOT_COST+2.000,
T1.COST8=T1.TOT_COST+2.000,
T1.COST9=T1.TOT_COST+2.000,
T1.COST10=T1.TOT_COST+2.000,
T1.COST11=T1.TOT_COST+2.000,
T1.COST12=T1.TOT_COST+2.000,
T1.COST13=T1.TOT_COST+2.000
from DBRMAST T1 
inner join DBRMAST t2 on t2.CODE=T1.CODE
paixão oráculo
fonte
2
Adicione alguns comentários à sua resposta para explicar o que está fazendo. No momento, isso é sinalizado como uma resposta de baixa qualidade e será excluído, a menos que seja aprimorado.
Ian