Perbarui beberapa kolom dalam SQL


166

Apakah ada cara untuk memperbarui beberapa kolom di SQL server dengan cara yang sama seperti pernyataan penyisipan digunakan?

Sesuatu seperti:

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

Atau sesuatu seperti itu, daripada seperti itu:

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

yang bisa sangat melelahkan untuk menulis jika Anda memiliki 100 kolom.


kedengarannya cukup rentan terhadap kesalahan
AD7six

Jika Anda melakukannya secara terprogram, gunakan kueri parameter dan Anda hanya perlu menulisnya sekali. Jika Anda melakukannya secara manual, gunakan editor SQL Management Studio dan masukkan data langsung ke baris daripada menulis kueri.
Dan Bechard

Jawaban:


89

"Cara melelahkan" adalah SQL standar dan bagaimana RDBMS arus utama melakukannya.

Dengan 100+ kolom, sebagian besar kemungkinan Anda memiliki masalah desain ... juga, ada metode yang meringankan dalam alat klien (misalnya pernyataan generasi UPDATE) atau dengan menggunakan ORM


5
Jadi tidak ada cara lain untuk melakukannya di MSSQL?
Joe

4
@ Jo: tidak. Lihat jawaban dari Alex K di bawah ini ( stackoverflow.com/a/9079904/27535 ), ada permintaan ke MS untuk menambahkannya
gbn

saya pikir gunakan 1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]"
DeLe

Setuju kembali. masalah desain secara umum tetapi ada keadaan di mana validasi massal / pembersihan data mungkin diperlukan. Saat ini saya terlibat dalam melakukan hal itu dan dalam SQL Server 2012 Anda sekarang dapat memperbarui lebih dari 1 kolom per @John Woo jawaban di bawah ini.
Hilary

201

Coba ini:

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

Itu harus bekerja di sebagian besar dialek SQL, tidak termasuk Oracle.

Dan ya - ini banyak mengetik - begitulah cara SQL melakukan ini.


4
Ini tidak akan berfungsi di Oracle: docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
Rafał

16
Hai. Anda benar, tapi saya hanya ingin menyatakannya tidak akan berfungsi dalam dialek SQL apa pun.
Rafał

3
Bekerja pada MySQL.
João Farias


19

Permintaan Anda hampir benar. T-SQL untuk ini adalah:

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

Saya menduga OP hanya menggunakan alias secara longgar karena pertanyaannya bukan tentang kebenaran sintaks, tetapi "mengapa" sintaks ini. Secara pribadi, saya lebih suka menggunakan alias di seluruh seperti yang saya lakukan di sini: stackoverflow.com/a/982947/27535
gbn

17

Sintaksis

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

Contoh

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

Anda bisa mencoba ini


4

Saya mencoba dengan cara ini dan berfungsi dengan baik:

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

Ini sepertinya berfungsi dengan baik untuk instalasi PostgreSQL 12.2 saya (diuji menggunakan DBeaver).
Telmo Trooper

1

di sini adalah salah satu yang berfungsi:

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

nilai adalah kolom dari table_2


1

Jika Anda perlu mengetik ulang ini beberapa kali, Anda dapat melakukannya seperti yang pernah saya lakukan. Dapatkan nama kolom Anda menjadi baris dalam lembar excel (tulis di akhir setiap nama kolom (=) yang mudah di notepad ++) di sebelah kanan buat kolom untuk menyalin dan menempelkan nilai Anda yang akan sesuai dengan entri baru di setiap kolom. Kemudian di sebelah kanan mereka di kolom independen menempatkan koma seperti yang dirancang

Maka Anda harus menyalin nilai-nilai Anda ke kolom tengah setiap kali kemudian tempel saja lalu jalankan

Saya tidak tahu solusi yang lebih mudah


0

Saya ingin berbagi dengan Anda bagaimana saya menjawab pertanyaan semacam ini. Kasus saya sedikit berbeda karena hasil dari table2 adalah dinamis dan nomor kolom mungkin kurang dari tabel1. Namun konsepnya sama.

Pertama, dapatkan hasil dari table2.

masukkan deskripsi gambar di sini

Selanjutnya, batalkan pengaruhnya.

masukkan deskripsi gambar di sini

Kemudian tulis permintaan pembaruan menggunakan SQL dinamis. Kode contoh ditulis untuk menguji 2 tabel sederhana - tblA dan 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 hasil:

masukkan deskripsi gambar di sini


-3

Saya melakukan ini di MySql dan memperbarui beberapa kolom dalam satu catatan, jadi coba ini jika Anda menggunakan MySql sebagai server Anda:

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

Namun, saya mengkode di vb.net menggunakan server MySql, tetapi Anda bisa membawanya ke bahasa pemrograman favorit Anda sejauh Anda menggunakan MySql sebagai server Anda.



-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
Harap tambahkan beberapa komentar untuk jawaban Anda untuk menjelaskan apa yang dilakukannya. Saat ini ditandai sebagai jawaban berkualitas rendah dan akan dihapus kecuali ditingkatkan.
Ian
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.