Mettre à jour plusieurs colonnes dans SQL


166

Existe-t-il un moyen de mettre à jour plusieurs colonnes dans SQL Server de la même manière qu'une instruction d'insertion est utilisée?

Quelque chose comme:

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 quelque chose comme ça, plutôt que comme ça:

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

ce qui peut être assez fastidieux à écrire si vous avez plus de 100 colonnes.


cela semble assez sujet à l'erreur
AD7six

Si vous le faites par programme, utilisez des requêtes paramétrées et vous n'aurez à l'écrire qu'une seule fois. Si vous le faites manuellement, utilisez l'éditeur de SQL Management Studio et entrez les données directement dans la ligne plutôt que d'écrire une requête.
Dan Bechard

Réponses:


89

Le «moyen fastidieux» est le SQL standard et la façon dont le SGBDR le fait.

Avec plus de 100 colonnes, vous avez probablement un problème de conception ... aussi, il existe des méthodes d'atténuation dans les outils client (par exemple, des instructions de génération UPDATE) ou en utilisant des ORM


5
Il n'y a donc pas d'autre moyen de le faire en MSSQL?
Joe

4
@Joe: non. Voir la réponse d'Alex K ci-dessous ( stackoverflow.com/a/9079904/27535 ), il y a une demande à MS pour l'ajouter
gbn

Je pense utiliser 1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]"
DeLe

D'accord re. problème de conception en termes généraux, mais il existe des circonstances où une validation en bloc / un nettoyage des données peut être nécessaire. Je suis actuellement engagé dans ce domaine et dans SQL Server 2012, vous pouvez désormais mettre à jour plus d'une colonne par réponse @John Woo ci-dessous.
Hilary

201

Essaye ça:

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

Cela devrait fonctionner dans la plupart des dialectes SQL, à l'exception d'Oracle.

Et oui - c'est beaucoup de frappe - c'est ainsi que SQL fait cela.


4
Cela ne fonctionnera pas dans Oracle: docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
Rafał

16
Salut. Vous avez raison, mais je voulais juste dire que cela ne fonctionnera dans aucun dialecte SQL.
Rafał

3
Fonctionne sur MySQL.
João Farias


19

Votre requête est presque correcte. Le T-SQL pour cela est:

UPDATE  Table1
SET     Field1 = Table2.Field1,
        Field2 = Table2.Field2,
        other columns...
FROM    Table2
WHERE   Table1.ID = Table2.ID

Je soupçonne que OP vient d'utiliser un alias de manière lâche parce que la question n'est pas sur l'exactitude de la syntaxe, mais "pourquoi" cette syntaxe. Personnellement, je préfère utiliser des alias partout comme je l'ai fait ici: stackoverflow.com/a/982947/27535
gbn

17

Syntaxe

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

Exemple

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

Tu peux essayer ça


4

J'ai essayé de cette façon et cela fonctionne bien:

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

Cela semble fonctionner correctement pour mon installation PostgreSQL 12.2 (testé avec DBeaver).
Telmo Trooper le

1

en voici un qui fonctionne:

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

valeur est la colonne de table_2


1

Si vous avez besoin de retaper plusieurs fois, vous pouvez faire comme je l'ai fait une fois. Obtenez les noms de vos colonnes en lignes dans une feuille Excel (écrivez à la fin de chaque nom de colonne (=) ce qui est facile dans notepad ++) sur le côté droit, créez une colonne pour copier et coller votre valeur qui correspondra aux nouvelles entrées à chaque colonne. Ensuite, à droite d'eux, dans une colonne indépendante, mettez les virgules comme prévu

Ensuite, vous devrez copier vos valeurs dans la colonne du milieu à chaque fois, puis simplement coller et exécuter

Je ne connais pas de solution plus simple


0

J'aimerais partager avec vous comment j'aborde ce genre de question. Mon cas est légèrement différent car le résultat de table2 est dynamique et les numéros de colonne peuvent être inférieurs à celui de table1. Mais le concept est le même.

Tout d'abord, obtenez le résultat de table2.

entrez la description de l'image ici

Ensuite, décompressez-le.

entrez la description de l'image ici

Ensuite, écrivez la requête de mise à jour à l'aide de SQL dynamique. Un exemple de code est écrit pour tester 2 tables simples - tblA et 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 résultat:

entrez la description de l'image ici


-3

J'ai fait cela dans MySql et il a mis à jour plusieurs colonnes dans un seul enregistrement, alors essayez ceci si vous utilisez MySql comme serveur:

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

Cependant, je codais dans vb.net en utilisant le serveur MySql, mais vous pouvez l'apporter à votre langage de programmation préféré dans la mesure où vous utilisez MySql comme serveur.



-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
Veuillez ajouter quelques commentaires à votre réponse pour expliquer ce qu'elle fait. Pour le moment, cela est signalé comme une réponse de faible qualité et sera supprimé à moins d'être amélioré.
Ian
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.