Aktualisieren Sie mehrere Spalten in SQL


166

Gibt es eine Möglichkeit, mehrere Spalten in SQL Server auf dieselbe Weise zu aktualisieren, wie eine Einfügeanweisung verwendet wird?

Etwas wie:

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

Oder so ähnlich, anstatt so:

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

Das Schreiben kann ziemlich mühsam sein, wenn Sie mehr als 100 Spalten haben.


das klingt ziemlich fehleranfällig
AD7six

Wenn Sie es programmgesteuert ausführen, verwenden Sie parametrisierte Abfragen, und Sie müssen es immer nur einmal schreiben. Wenn Sie dies manuell tun, verwenden Sie den Editor von SQL Management Studio und geben Sie die Daten direkt in die Zeile ein, anstatt eine Abfrage zu schreiben.
Dan Bechard

Antworten:


88

Der "lästige Weg" ist Standard-SQL und wie Mainstream-RDBMS es tun.

Bei mehr als 100 Spalten haben Sie höchstwahrscheinlich ein Entwurfsproblem. Außerdem gibt es mildernde Methoden in Client-Tools (z. B. Generierung von UPDATE-Anweisungen) oder mithilfe von ORMs


5
Es gibt also keine andere Möglichkeit, dies in MSSQL zu tun?
Joe

4
@ Joe: nein. Siehe Antwort von Alex K unten ( stackoverflow.com/a/9079904/27535 ), es gibt eine Anfrage an MS, es hinzuzufügen
gbn

Ich denke, verwenden Sie 1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]"
DeLe

Stimme zu. Entwurfsproblem im Allgemeinen, aber es gibt Umstände, unter denen eine Massenvalidierung / Datenbereinigung erforderlich sein kann. Ich bin derzeit damit beschäftigt und in SQL Server 2012 können Sie jetzt mehr als eine Spalte pro @ John Woo-Antwort unten aktualisieren.
Hilary

201

Versuche dies:

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

Dies sollte in den meisten SQL-Dialekten außer Oracle funktionieren.

Und ja - es wird viel getippt - so macht SQL das.


4
Dies funktioniert nicht in Oracle: docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
Rafał

16
Hallo. Sie haben Recht, aber ich wollte nur sagen, dass es in keinem SQL-Dialekt funktioniert.
Rafał

3
Funktioniert unter MySQL.
João Farias


19

Ihre Anfrage ist fast korrekt. Das T-SQL dafür ist:

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

Ich vermute, OP hat nur einen Alias ​​lose verwendet, weil es nicht um die Richtigkeit der Syntax geht, sondern um das "Warum" dieser Syntax. Persönlich bevorzuge ich die Verwendung von Aliasen wie hier: stackoverflow.com/a/982947/27535
gbn

17

Syntax

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

Beispiel

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

Sie können dies versuchen


4

Ich habe es auf diese Weise versucht und es funktioniert gut:

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

Dies scheint für meine PostgreSQL 12.2-Installation (getestet mit DBeaver) gut zu funktionieren.
Telmo Trooper

1

Hier ist eine, die funktioniert:

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

Wert ist die Spalte aus Tabelle_2


1

Wenn Sie dies mehrmals neu eingeben müssen, können Sie es wie ich einmal tun. Holen Sie sich die Namen Ihrer Spalten in Zeilen in Excel-Tabelle (notieren Sie sich am Ende jedes Spaltennamens (=), was in Notepad ++ einfach ist) auf der rechten Seite. Erstellen Sie eine Spalte, um Ihren Wert zu kopieren und einzufügen, der den neuen Einträgen bei entspricht jede Spalte. Dann setzen Sie rechts davon in einer unabhängigen Spalte die Kommas wie vorgesehen

Dann müssen Sie Ihre Werte jedes Mal in die mittlere Spalte kopieren, dann einfach einfügen und ausführen

Ich kenne keine einfachere Lösung


0

Ich möchte Ihnen mitteilen, wie ich diese Art von Frage anspreche. Mein Fall ist etwas anders, da das Ergebnis von Tabelle2 dynamisch ist und die Spaltennummern möglicherweise kleiner als die von Tabelle1 sind. Das Konzept ist jedoch dasselbe.

Erhalten Sie zuerst das Ergebnis von Tabelle2.

Geben Sie hier die Bildbeschreibung ein

Als nächstes drehen Sie es auf.

Geben Sie hier die Bildbeschreibung ein

Schreiben Sie dann die Aktualisierungsabfrage mit dynamischem SQL. Beispielcode wurde zum Testen von 2 einfachen Tabellen geschrieben - tblA und 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 Ergebnis:

Geben Sie hier die Bildbeschreibung ein


-3

Ich habe dies in MySQL getan und es hat mehrere Spalten in einem einzigen Datensatz aktualisiert. Versuchen Sie dies also, wenn Sie MySQL als Server verwenden:

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

Ich habe in vb.net mit dem MySql-Server codiert, aber Sie können es zu Ihrer bevorzugten Programmiersprache bringen, sofern Sie MySql als Server verwenden.



-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
Bitte fügen Sie Ihrer Antwort einen Kommentar hinzu, um zu erklären, was sie tut. Im Moment wird dies als Antwort von geringer Qualität gekennzeichnet und gelöscht, sofern keine Verbesserung vorliegt.
Ian
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.