Cập nhật nhiều cột trong SQL


166

Có cách nào để cập nhật nhiều cột trong máy chủ SQL giống như cách sử dụng câu lệnh chèn không?

Cái gì đó như:

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

Hoặc một cái gì đó như thế, thay vì như vậy:

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

có thể khá mệt mỏi để viết nếu bạn có hơn 100 cột.


Nghe có vẻ khá dễ bị lỗi
AD7six

Nếu bạn đang thực hiện theo chương trình, hãy sử dụng các truy vấn được tham số hóa và bạn chỉ phải viết nó một lần. Nếu bạn đang thực hiện thủ công, hãy sử dụng trình soạn thảo của SQL Management Studio và nhập dữ liệu trực tiếp vào hàng thay vì viết truy vấn.
Dan Bechard

Câu trả lời:


88

"Cách mệt mỏi" là SQL tiêu chuẩn và cách RDBMS chính thống thực hiện.

Với hơn 100 cột, rất có thể bạn có vấn đề về thiết kế ... ngoài ra, có các phương thức giảm thiểu trong các công cụ máy khách (ví dụ: tạo câu lệnh UPDATE) hoặc bằng cách sử dụng ORM


5
Vì vậy, không có cách nào khác để làm điều đó trong MSSQL?
Joe

4
@Joe: không. Xem câu trả lời từ Alex K bên dưới ( stackoverflow.com/a/9079904/27535 ), có một yêu cầu để MS thêm nó
gbn

tôi nghĩ rằng hãy sử dụng 1keydata.com/sql/sqlupdate.html "SET cột_1 = [value1], cột_2 = [value2]"
DeLe

Đồng ý lại. vấn đề thiết kế nói chung nhưng có những trường hợp có thể yêu cầu xác thực hàng loạt / làm sạch dữ liệu. Tôi hiện đang tham gia vào việc này và trong SQL Server 2012, giờ đây bạn có thể cập nhật nhiều hơn 1 cột cho mỗi câu trả lời @John Woo bên dưới.
Hilary

201

Thử cái này:

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

Điều đó sẽ làm việc trong hầu hết các phương ngữ SQL, ngoại trừ Oracle.

Và vâng - đó là rất nhiều cách gõ - đó là cách SQL thực hiện điều này.


4
Điều này sẽ không hoạt động trong Oracle: docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
Rafał

16
Chào. Bạn nói đúng, nhưng tôi chỉ muốn nói rằng nó không hoạt động trong bất kỳ phương ngữ SQL nào.
Rafał

3
Hoạt động trên MySQL.
João Farias


19

Truy vấn của bạn là gần đúng. T-SQL cho điều này là:

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

Tôi nghi ngờ OP chỉ sử dụng một bí danh một cách lỏng lẻo vì câu hỏi không phải là về tính chính xác của cú pháp, mà là "tại sao" cú pháp này. Cá nhân, tôi thích sử dụng các bí danh xuyên suốt như tôi đã làm ở đây: stackoverflow.com/a/982947/27535
gbn

17

Cú pháp

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

Thí dụ

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

Bạn có thể thử cái này


4

Tôi đã thử với cách này và nó hoạt động tốt:

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

Điều này dường như hoạt động tốt cho cài đặt PostgreSQL 12.2 của tôi (được thử nghiệm bằng DBeaver).
Telmo Trooper

1

đây là một trong những hoạt động:

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

giá trị là cột từ bảng_2


1

Nếu bạn cần gõ lại vài lần, bạn có thể làm như tôi đã làm một lần. Đặt tên cột của bạn thành các hàng trong bảng excel (ghi vào cuối mỗi tên cột (=) dễ dàng trong notepad ++) ở bên phải tạo một cột để sao chép và dán giá trị của bạn sẽ tương ứng với các mục nhập mới tại từng cột. Sau đó, bên phải của chúng trong một cột độc lập đặt dấu phẩy như thiết kế

Sau đó, bạn sẽ phải sao chép giá trị của mình vào cột giữa mỗi lần, sau đó chỉ cần dán rồi chạy

Tôi không biết một giải pháp dễ dàng hơn


0

Tôi muốn chia sẻ với bạn cách tôi giải quyết loại câu hỏi này. Trường hợp của tôi hơi khác một chút do kết quả của bảng2 là động và số cột có thể nhỏ hơn bảng1. Nhưng khái niệm là như nhau.

Đầu tiên, lấy kết quả của bảng2.

nhập mô tả hình ảnh ở đây

Tiếp theo, bỏ xoay nó.

nhập mô tả hình ảnh ở đây

Sau đó viết truy vấn cập nhật bằng SQL động. Mã mẫu được viết để kiểm tra 2 bảng đơn giản - tblA và 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 kết quả:

nhập mô tả hình ảnh ở đây


-3

Tôi đã làm điều này trong MySql và nó đã cập nhật nhiều cột trong một bản ghi, vì vậy hãy thử điều này nếu bạn đang sử dụng MySql làm máy chủ của mình:

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

Tuy nhiên, tôi đã mã hóa trong vb.net bằng máy chủ MySql, nhưng bạn có thể đưa nó đến ngôn ngữ lập trình yêu thích của bạn, theo như bạn đang sử dụng MySql làm máy chủ của mình.



-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
Vui lòng thêm một số bình luận vào câu trả lời của bạn để giải thích những gì nó đang làm. Tại thời điểm này, nó được gắn cờ là một câu trả lời chất lượng thấp và sẽ bị xóa trừ khi được cải thiện.
Ian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.