Zaktualizuj wiele kolumn w języku SQL

166

Czy istnieje sposób aktualizowania wielu kolumn w programie SQL Server w taki sam sposób, jak używana jest instrukcja wstawiania?

Coś jak:

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

Lub coś takiego, a nie tak:

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

co może być dość męczące, jeśli masz ponad 100 kolumn.

Joe
źródło
brzmi to dość podatnie na błędy
AD7six
Jeśli robisz to programowo, używaj sparametryzowanych zapytań i wystarczy napisać to tylko raz. Jeśli robisz to ręcznie, użyj edytora SQL Management Studio i wprowadź dane bezpośrednio do wiersza, zamiast pisać zapytanie.
Dan Bechard

Odpowiedzi:

89

„Męczący sposób” to standardowy SQL i sposób, w jaki robią to popularne RDBMS.

Przy ponad 100 kolumnach najprawdopodobniej masz problem z projektowaniem ... ponadto istnieją metody łagodzące w narzędziach klienta (np. Generowanie instrukcji UPDATE) lub za pomocą ORMów

gbn
źródło
5
Więc nie ma innego sposobu, aby to zrobić w MSSQL?
Joe
4
@Joe: nie. Zobacz odpowiedź Alexa K poniżej ( stackoverflow.com/a/9079904/27535 ), istnieje prośba do MS o jej dodanie
gbn
myślę, że użyj 1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]"
DeLe,
Zgadzam się ponownie. problem projektowy w kategoriach ogólnych, ale istnieją okoliczności, w których może być wymagana zbiorcza walidacja / czyszczenie danych. Obecnie zajmuję się tym i w SQL Server 2012 możesz teraz zaktualizować więcej niż 1 kolumnę na odpowiedź @John Woo poniżej.
Hilary
201

Spróbuj tego:

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

To powinno działać w większości dialektów SQL, z wyjątkiem Oracle.

I tak - to dużo pisania - tak robi to SQL.

marc_s
źródło
4
To nie zadziała w Oracle: docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
Rafał
16
Cześć. Masz rację, ale chciałem tylko stwierdzić, że nie zadziała w żadnym dialekcie SQL.
Rafał
3
Działa na MySQL.
João Farias
19

Twoje zapytanie jest prawie poprawne. T-SQL do tego to:

UPDATE  Table1
SET     Field1 = Table2.Field1,
        Field2 = Table2.Field2,
        other columns...
FROM    Table2
WHERE   Table1.ID = Table2.ID
John Woo
źródło
Podejrzewam, że OP po prostu użył luźno aliasu, ponieważ pytanie nie dotyczy poprawności składni, ale „dlaczego” ta składnia. Osobiście wolę używać aliasów tak jak tutaj: stackoverflow.com/a/982947/27535
gbn
17

Składnia

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

Przykład

UPDATE school
SET course = 'mysqli', teacher = 'Tanzania', student = 'you'
WHERE id = 6
betrice mpalanzi
źródło
8
   UPDATE t1 
    SET 
    t1.a = t2.a,
    t1.b = t2.b,
    .
    .
    .


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

Możesz tego spróbować

Thangamani Palanisamy
źródło
4

Próbowałem w ten sposób i działa dobrze:

UPDATE 
  Emp
SET 
  ID = 123, 
  Name = 'Peter' 
FROM 
  Table_Name
Piotr
źródło
Wydaje się, że działa to dobrze dla mojej instalacji PostgreSQL 12.2 (testowane przy użyciu DBeavera).
Telmo Trooper
1

tutaj jest taki, który działa:

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

wartość to kolumna z tabeli_2

Dragos Custura
źródło
1

Jeśli musisz wpisać to ponownie kilka razy, możesz zrobić tak, jak kiedyś. Umieść nazwy kolumn w wierszach w arkuszu programu Excel (zapisz na końcu nazwy każdej kolumny (=), co jest łatwe w notatniku ++) po prawej stronie utwórz kolumnę do skopiowania i wklejania wartości, która będzie odpowiadać nowym wpisom w każda kolumna. Następnie po prawej stronie w niezależnej kolumnie umieść przecinki zgodnie z projektem

Następnie za każdym razem będziesz musiał skopiować swoje wartości do środkowej kolumny, a następnie po prostu wkleić i uruchomić

Nie znam prostszego rozwiązania

Mohamed Bekheit
źródło
0

Chciałbym się z Tobą podzielić, jak odpowiadam na tego rodzaju pytania. Mój przypadek jest nieco inny, ponieważ wynik z tabeli 2 jest dynamiczny, a numery kolumn mogą być mniejsze niż w tabeli 1. Ale koncepcja jest taka sama.

Najpierw uzyskaj wynik tabela2.

wprowadź opis obrazu tutaj

Następnie cofnij obrót.

wprowadź opis obrazu tutaj

Następnie napisz zapytanie aktualizacyjne za pomocą dynamicznego SQL. Przykładowy kod jest napisany do testowania 2 prostych tabel - tblA i 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 wynik:

wprowadź opis obrazu tutaj

Weihui Guo
źródło
-3

Zrobiłem to w MySql i zaktualizowałem wiele kolumn w jednym rekordzie, więc spróbuj tego, jeśli używasz MySql jako serwera:

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

Jednak kodowałem w vb.net używając serwera MySql, ale możesz zabrać go do swojego ulubionego języka programowania, o ile używasz MySql jako serwera.

Michael Kisingi
źródło
-4
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

http://www.w3schools.com/sql/sql_update.asp

Mellad Qarizada
źródło
2
To właściwie tylko powtórzenie istniejących odpowiedzi.
Pang
-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
pasja wyroczni
źródło
2
Dodaj komentarz do swojej odpowiedzi, aby wyjaśnić, co robi. W tej chwili jest to oznaczane jako odpowiedź niskiej jakości i zostanie usunięte, chyba że zostanie poprawione.
Ian