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.


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


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



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

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

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ć


4

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

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

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


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


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


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



-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
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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.