Actualizar varias columnas en SQL

166

¿Hay alguna manera de actualizar varias columnas en el servidor SQL de la misma manera que se usa una instrucción de inserción?

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

O algo así, más que así:

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

que puede ser bastante pesado escribir si tienes más de 100 columnas.

Joe
fuente
eso suena bastante propenso a errores
AD7six
Si lo está haciendo mediante programación, use consultas parametrizadas y solo tendrá que escribirlo una vez. Si lo está haciendo manualmente, use el editor de SQL Management Studio e ingrese los datos directamente en la fila en lugar de escribir una consulta.
Dan Bechard

Respuestas:

89

La "forma cansada" es el SQL estándar y cómo lo hace RDBMS convencional.

Con más de 100 columnas, lo más probable es que tenga un problema de diseño ... también, existen métodos de mitigación en las herramientas del cliente (por ejemplo, declaraciones UPDATE de generación) o mediante el uso de ORM

gbn
fuente
55
Entonces, ¿no hay otra forma de hacerlo en MSSQL?
Joe
44
@ Joe: no. Vea la respuesta de Alex K a continuación ( stackoverflow.com/a/9079904/27535 ), hay una solicitud a MS para agregarla
gbn
creo que use 1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]"
DeLe
De acuerdo re. problema de diseño en términos generales, pero hay circunstancias en las que se puede requerir validación masiva / limpieza de datos. Actualmente estoy involucrado en esto y en SQL Server 2012 ahora puede actualizar más de 1 columna por respuesta de @John Woo a continuación.
Hilary
201

Prueba esto:

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

Eso debería funcionar en la mayoría de los dialectos de SQL, excluyendo Oracle.

Y sí, es mucho tipeo, es la forma en que SQL hace esto.

marc_s
fuente
44
Esto no funcionará en Oracle: docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
Rafał
16
Hola. Tienes razón, pero solo quería decir que no funcionará en ningún dialecto SQL.
Rafał
3
Funciona en MySQL.
João Farias
19

Su consulta es casi correcta. El T-SQL para esto es:

UPDATE  Table1
SET     Field1 = Table2.Field1,
        Field2 = Table2.Field2,
        other columns...
FROM    Table2
WHERE   Table1.ID = Table2.ID
John Woo
fuente
Sospecho que OP simplemente usó un alias de manera suelta porque la pregunta no es sobre la corrección de la sintaxis, sino "por qué" esta sintaxis. Personalmente, prefiero usar alias como hice aquí: stackoverflow.com/a/982947/27535
gbn
17

Sintaxis

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

Ejemplo

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


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

Puedes probar esto

Thangamani Palanisamy
fuente
4

Lo intenté de esta manera y funciona bien:

UPDATE 
  Emp
SET 
  ID = 123, 
  Name = 'Peter' 
FROM 
  Table_Name
Peter
fuente
Esto parece funcionar bien para mi instalación de PostgreSQL 12.2 (probado usando DBeaver).
Telmo Trooper
1

Aquí hay uno que funciona:

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

valor es la columna de la tabla_2

Dragos Custura
fuente
1

Si necesita volver a escribir esto varias veces, puede hacer lo que hice una vez. Obtenga los nombres de sus columnas en filas en la hoja de Excel (escriba al final de cada nombre de columna (=), que es fácil en Notepad ++) en el lado derecho, haga una columna para copiar y pegar su valor que corresponderá a las nuevas entradas en cada columna Luego, a la derecha de ellos, en una columna independiente, coloque las comas como fueron diseñadas

Luego, tendrá que copiar sus valores en la columna central cada vez, luego simplemente pegar y ejecutar

No conozco una solución más fácil.

Mohamed Bekheit
fuente
0

Me gustaría compartir con ustedes cómo abordo este tipo de preguntas. Mi caso es ligeramente diferente ya que el resultado de table2 es dinámico y los números de columna pueden ser menores que el de table1. Pero el concepto es el mismo.

Primero, obtenga el resultado de table2.

ingrese la descripción de la imagen aquí

A continuación, desenredarlo.

ingrese la descripción de la imagen aquí

Luego escriba la consulta de actualización usando SQL dinámico. El código de muestra está escrito para probar 2 tablas simples: tblA y 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:

ingrese la descripción de la imagen aquí

Weihui Guo
fuente
-3

Hice esto en MySql y actualizó varias columnas en un solo registro, así que intente esto si está usando MySql como su servidor:

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

Sin embargo, estaba codificando en vb.net usando el servidor MySql, pero puede llevarlo a su lenguaje de programación favorito siempre que use MySql como su servidor.

Michael Kisingi
fuente
-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
pasión oráculo
fuente
2
Agregue algunos comentarios a su respuesta para explicar lo que está haciendo. Por el momento, esto se marca como una respuesta de baja calidad y se eliminará a menos que se mejore.
Ian