อัปเดตหลายคอลัมน์ใน SQL


166

มีวิธีอัปเดตหลายคอลัมน์ในเซิร์ฟเวอร์ SQL เช่นเดียวกับที่ใช้คำสั่ง insert หรือไม่?

สิ่งที่ต้องการ:

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

หรืออะไรทำนองนั้นแทนที่จะชอบ:

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

ซึ่งน่าเบื่อที่จะเขียนถ้าคุณมี 100+ คอลัมน์


ฟังดูค่อนข้างจะผิดพลาด
AD7six

หากคุณกำลังเขียนโปรแกรมโดยใช้แบบสอบถามแบบใช้พารามิเตอร์และคุณต้องเขียนเพียงครั้งเดียวเท่านั้น หากคุณทำด้วยตนเองให้ใช้ตัวแก้ไขของ SQL Management Studio และป้อนข้อมูลลงในแถวโดยตรงแทนที่จะเขียนแบบสอบถาม
Dan Bechard

คำตอบ:


89

"วิธีที่น่าเบื่อ" คือ SQL มาตรฐานและ RDBMS สำคัญทำอย่างไร

ด้วยคอลัมน์มากกว่า 100 รายการคุณน่าจะมีปัญหาในการออกแบบเป็นอย่างมาก ... และยังมีวิธีการลดความยุ่งยากในเครื่องมือไคลเอ็นต์ (เช่นการสร้างคำสั่ง UPDATE) หรือโดยใช้ ORM


5
ดังนั้นไม่มีวิธีอื่นที่จะทำใน MSSQL?
Joe

4
@Joe: ไม่ ดูคำตอบจาก Alex K ด้านล่าง ( stackoverflow.com/a/9079904/27535 ) มีคำขอไปยัง MS เพื่อเพิ่ม
gbn

ฉันคิดว่าใช้1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]"
DeLe

เห็นด้วยอีกครั้ง ปัญหาการออกแบบในแง่ทั่วไป แต่มีสถานการณ์ที่อาจต้องมีการตรวจสอบ / การทำความสะอาดข้อมูลจำนวนมาก ฉันมีส่วนร่วมในการทำเช่นนั้นและใน SQL Server 2012 ตอนนี้คุณสามารถอัปเดตมากกว่า 1 คอลัมน์ต่อ @John Woo คำตอบด้านล่าง
Hilary

201

ลองสิ่งนี้:

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

ซึ่งควรใช้กับภาษาถิ่น SQL ส่วนใหญ่ยกเว้น Oracle

และใช่ - มันมีการพิมพ์จำนวนมาก - เป็นวิธีที่ SQL ทำเช่นนี้


4
สิ่งนี้จะไม่ทำงานใน Oracle: docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
Rafał

16
สวัสดี ถูกต้อง แต่ฉันแค่อยากจะบอกว่ามันจะไม่ทำงานในภาษา SQL ใด ๆ
Rafał

3
ทำงานบน MySQL
João Farias


19

คำค้นหาของคุณใกล้ถูกต้องแล้ว T-SQL สำหรับสิ่งนี้คือ:

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

ฉันสงสัยว่า OP เพิ่งใช้นามแฝงอย่างหลวม ๆ เพราะคำถามไม่ได้เกี่ยวกับความถูกต้องของไวยากรณ์ แต่ "ทำไม" ไวยากรณ์นี้ โดยส่วนตัวแล้วฉันชอบใช้ชื่อแทนตลอดเหมือนที่ฉันทำที่นี่: stackoverflow.com/a/982947/27535
gbn

17

วากยสัมพันธ์

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

ตัวอย่าง

UPDATE school
SET course = 'mysqli', teacher = 'Tanzania', student = 'you'
WHERE id = 6


4

ฉันลองด้วยวิธีนี้และทำงานได้ดี:

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

ดูเหมือนว่าจะทำงานได้ดีสำหรับการติดตั้ง PostgreSQL 12.2 ของฉัน (ทดสอบโดยใช้ DBeaver)
Telmo Trooper

1

นี่คือสิ่งที่ใช้ได้ผล:

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

value คือคอลัมน์จาก table_2


1

หากคุณต้องการพิมพ์ซ้ำหลาย ๆ ครั้งคุณสามารถทำเช่นนั้นได้อีกครั้ง รับชื่อ Column` ของคุณลงในแถวในแผ่นงาน Excel (จดที่ท้ายชื่อแต่ละคอลัมน์ (=) ซึ่งง่ายใน notepad ++) ทางด้านขวาให้คอลัมน์เพื่อคัดลอกและวางค่าของคุณที่จะสอดคล้องกับรายการใหม่ที่ แต่ละคอลัมน์ จากนั้นทางด้านขวาของพวกเขาในคอลัมน์อิสระให้ใส่เครื่องหมายจุลภาคตามที่ออกแบบไว้

จากนั้นคุณจะต้องคัดลอกค่าของคุณลงในคอลัมน์กลางในแต่ละครั้งจากนั้นให้วางแล้วเรียกใช้

ฉันไม่ทราบวิธีแก้ปัญหาที่ง่ายขึ้น


0

ฉันต้องการแบ่งปันกับคุณว่าฉันตอบคำถามประเภทนี้อย่างไร เคสของฉันแตกต่างกันเล็กน้อยเนื่องจากผลลัพธ์ของ table2 เป็นแบบไดนามิกและหมายเลขคอลัมน์อาจน้อยกว่าของ table1 แต่แนวคิดก็เหมือนกัน

ก่อนอื่นรับผลของ table2

ป้อนคำอธิบายรูปภาพที่นี่

ถัดไปยกเลิกการหมุน

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นเขียนคิวรีอัปเดตโดยใช้ไดนามิก SQL โค้ดตัวอย่างถูกเขียนขึ้นสำหรับการทดสอบ 2 ตารางง่ายๆ - tblA และ 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 ผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่


-3

ฉันทำสิ่งนี้ใน MySql และอัปเดตหลายคอลัมน์ในบันทึกเดียวดังนั้นให้ลองทำสิ่งนี้หากคุณใช้ MySql เป็นเซิร์ฟเวอร์ของคุณ:

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

อย่างไรก็ตามฉันเขียนโค้ดใน vb.net โดยใช้เซิร์ฟเวอร์ MySql แต่คุณสามารถนำไปใช้เป็นภาษาโปรแกรมที่คุณโปรดปรานได้ตราบใดที่คุณใช้ MySql เป็นเซิร์ฟเวอร์ของคุณ



-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
โปรดเพิ่มความเห็นลงในคำตอบของคุณเพื่ออธิบายสิ่งที่กำลังทำอยู่ ในขณะนี้สิ่งนี้ถูกตั้งค่าสถานะเป็นคำตอบที่มีคุณภาพต่ำและจะถูกลบออกเว้นแต่จะปรับปรุง
เอียน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.