Aggiorna più colonne in SQL


166

Esiste un modo per aggiornare più colonne nel server SQL nello stesso modo in cui viene utilizzata un'istruzione insert?

Qualcosa di simile a:

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 qualcosa del genere, piuttosto che così:

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

che può essere piuttosto noioso da scrivere se hai più di 100 colonne.


sembra abbastanza incline all'errore
AD7six

Se lo stai facendo a livello di codice, usa query con parametri e dovrai scriverlo una sola volta. Se lo stai facendo manualmente, usa l'editor di SQL Management Studio e inserisci i dati direttamente nella riga anziché scrivere una query.
Dan Bechard,

Risposte:


89

Il "modo noioso" è SQL standard e il modo in cui RDBMS tradizionale lo fa.

Con oltre 100 colonne, probabilmente hai un problema di progettazione ... inoltre, ci sono metodi attenuanti negli strumenti client (ad es. Istruzioni UPDATE di generazione) o usando gli ORM


5
Quindi non c'è altro modo per farlo in MSSQL?
Joe

4
@Joe: no. Vedi la risposta di Alex K di seguito ( stackoverflow.com/a/9079904/27535 ), c'è una richiesta a MS di aggiungerla
gbn

penso che usi 1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]"
DeLe

Accetto con riferimento a. problema di progettazione in termini generali, ma ci sono circostanze in cui può essere richiesta una validazione in blocco / pulizia dei dati. Attualmente mi sto impegnando in questo modo e in SQL Server 2012 ora puoi aggiornare più di 1 colonna per @John Woo risposta di seguito.
Ilario

201

Prova questo:

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

Ciò dovrebbe funzionare nella maggior parte dei dialetti SQL, escluso Oracle.

E sì - è un sacco di digitazione - è il modo in cui SQL fa questo.



16
Ciao. Hai ragione, ma volevo solo affermare che non funzionerà in nessun dialetto SQL.
Rafał,

3
Funziona su MySQL.
João Farias,


19

La tua query è quasi corretta. Il T-SQL per questo è:

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

Sospetto che OP abbia appena usato un alias vagamente perché la domanda non riguarda la correttezza della sintassi, ma "perché" questa sintassi. Personalmente, preferisco usare gli alias in tutto come ho fatto qui: stackoverflow.com/a/982947/27535
gbn

17

Sintassi

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

Esempio

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

Puoi provare questo


4

Ho provato in questo modo e funziona bene:

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

Questo sembra funzionare bene per la mia installazione PostgreSQL 12.2 (testato usando DBeaver).
Telmo Trooper,

1

eccone uno che funziona:

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

valore è la colonna da table_2


1

Se devi riscriverlo più volte, puoi fare come una volta. Prendi i nomi delle tue colonne in righe nel foglio di Excel (scrivi alla fine di ogni nome di colonna (=) che è facile nel blocco note ++) sul lato destro crea una colonna per copiare e incollare il tuo valore che corrisponderà alle nuove voci in ogni colonna. Quindi a destra di loro in una colonna indipendente mettere le virgole come previsto

Quindi dovrai copiare i tuoi valori nella colonna centrale ogni volta, quindi incollarli ed eseguirli

Non conosco una soluzione più semplice


0

Vorrei condividere con te come affronterò questo tipo di domanda. Il mio caso è leggermente diverso poiché il risultato di table2 è dinamico e i numeri di colonna potrebbero essere inferiori a quelli di table1. Ma il concetto è lo stesso.

Innanzitutto, ottieni il risultato di table2.

inserisci qui la descrizione dell'immagine

Quindi, annullalo.

inserisci qui la descrizione dell'immagine

Quindi scrivere la query di aggiornamento utilizzando SQL dinamico. Il codice di esempio è scritto per il test di 2 semplici tabelle: 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 risultato:

inserisci qui la descrizione dell'immagine


-3

L'ho fatto in MySql e ha aggiornato più colonne in un singolo record, quindi prova questo se stai usando MySql come server:

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

Tuttavia, stavo codificando in vb.net usando il server MySql, ma puoi portarlo nel tuo linguaggio di programmazione preferito per quanto stai usando MySql come server.



-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
Aggiungi un commento alla tua risposta per spiegare cosa sta facendo. Al momento questo è contrassegnato come una risposta di bassa qualità e verrà eliminato se non migliorato.
Ian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.