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.


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


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.



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

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

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


4

Eu tentei com este caminho e está funcionando bem:

UPDATE 
  Emp
SET 
  ID = 123, 
  Name = 'Peter' 
FROM 
  Table_Name

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


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


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


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



-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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.