2012-01-31 39 views
123

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

Algo así 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 por el estilo, en lugar de este modo:

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

que puede ser bastante tedioso para escribir si tiene más de 100 columnas.

+0

¿Qué servidor Whish estás usando? – sll

+0

suena bastante propenso al error – AD7six

+0

Esto es solo un ejemplo y no un código completo. Estoy usando MSSQL – Joe

Respuesta

66

La "manera fastidiosa" es SQL estándar y cómo lo hacen los RDBMS convencionales.

Con más de 100 columnas, que en su mayoría probablemente tienen un problema de diseño ... También, hay métodos de mitigación en las herramientas de cliente (por ejemplo, las instrucciones UPDATE generación) o mediante el uso de ORM

+3

Entonces, ¿no hay otra forma de hacerlo en MSSQL? – Joe

+2

@Joe: no. Ver la respuesta de Alex K a continuación (http://stackoverflow.com/a/9079904/27535), hay una solicitud a MS para agregarlo – gbn

+0

creo que uso http://www.1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]" – DeLe

144

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 SQL, excluyendo Oracle.

Y sí, es un montón de tipeo, es la forma en que SQL hace esto.

+3

Esto no funcionará en Oracle: http://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html –

+2

@ Rafał: la pregunta era sobre Microsoft ** SQL Server ** ... –

+13

Hola . Tienes razón, pero solo quería decir que no funcionará en ningún dialecto SQL. –

15

Su consulta es 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 
+0

Sospecho que OP acaba de usar un alias vagamente porque la pregunta no es sobre la corrección de la sintaxis, sino el "por qué" de esta sintaxis. Personalmente, prefiero usar alias como hice aquí: http://stackoverflow.com/a/982947/27535 – gbn

18

La sintaxis Update table1 set (a,b,c) = (select x,y,x) es un ejemplo de la utilización de constructores fila valor, Oracle supports this, MSSQL no lo hace. (Connect item)

1

aquí es uno que funcione:

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

valor es la columna de table_2

8
UPDATE t1 
    SET 
    t1.a = t2.a, 
    t1.b = t2.b, 
    . 
    . 
    . 


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

Puede probar este

+0

Esto funciona en SQLServer, gracias! – IvoTops

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

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

0

Si necesita volver Escribe esto varias veces, puedes hacer lo mismo que hice una vez. Obtenga los nombres de sus columnas en filas en hoja de Excel (anote al final de cada nombre de columna (=) que es fácil en el bloc de notas ++) en el lado derecho haga una columna para copiar y pegar el valor que corresponderá a las nuevas entradas en cada columnaA continuación, a la derecha de ellos en una columna independiente de poner las comas como fue diseñado

A continuación, tendrá que copiar sus valores en la columna del medio cada vez luego simplemente pegar entonces y ejecutar

no sé una solución más fácil

0

he intentado con esta forma y su funcionamiento muy bien:

UPDATE 
    Sub2 
SET 
    SLNNOND = Sub.SLNNOND, 
    Sub2.SLNNONF = Sub.SLNNONF 
FROM 
    #TEMP Sub2 
6

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

hice esto en MySQL y actualizada varias columnas en un solo registro, por lo que intento esto si está utilizando 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 servidor.

Cuestiones relacionadas