SQL'de birden çok sütunu güncelleme


166

SQL Server'da bir insert deyimi kullanıldığı gibi birden çok sütunu güncellemenin bir yolu var mı?

Gibi bir şey:

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

Veya böyle bir şey yerine, böyle bir şey:

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

100'den fazla sütun varsa yazmak oldukça yorucu olabilir.


hataya oldukça eğilimli geliyor
AD7six

Programlı olarak yapıyorsanız parametreli sorgular kullanın ve yalnızca bir kez yazmanız gerekir. Manuel olarak yapıyorsanız, SQL Management Studio'nun düzenleyicisini kullanın ve verileri sorgu yazmak yerine doğrudan satıra girin.
Dan Bechard

Yanıtlar:


89

"Yorucu yol" standart SQL ve ana RDBMS nasıl yapar.

100'den fazla sütunda, büyük olasılıkla bir tasarım probleminiz var ... ayrıca, istemci araçlarında (örneğin, UPDATE nesli oluşturma) veya ORM'leri kullanarak azaltma yöntemleri de var


5
MSSQL'de bunu yapmanın başka bir yolu yok mu?
Joe

4
@Joe: hayır. Aşağıdaki Alex K'nin cevabına bakınız ( stackoverflow.com/a/9079904/27535 ), MS'den eklemek için bir talep var
gbn

bence 1keydata.com/sql/sqlupdate.html "SET column_1 = [değer1], column_2 = [değer2]"
DeLe 9:01 '

Kabul et. genel anlamda tasarım problemi ancak toplu doğrulama / veri temizlemesinin gerekli olabileceği durumlar vardır. Şu anda bunu yapmakla meşgulüm ve SQL Server 2012'de şimdi aşağıdaki John Woo cevabı başına 1'den fazla sütun güncelleyebilirsiniz.
Hilary



19

Sorgunuz neredeyse doğrudur. Bunun için T-SQL:

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

OP'nin sadece bir takma ad kullanmış olduğundan şüpheleniyorum çünkü soru sözdiziminin doğruluğu ile ilgili değil, ama bu sözdiziminin "neden" ile ilgili. Şahsen, burada yaptığım gibi takma adları kullanmayı tercih ederim: stackoverflow.com/a/982947/27535
gbn

17

Sözdizimi

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

Misal

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

Bunu deneyebilirsin


4

Ben bu şekilde denedim ve iyi çalışıyor:

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

Bu benim PostgreSQL 12.2 kurulumu (DBeaver kullanılarak test edilmiş) için iyi çalışıyor gibi görünüyor.
Telmo Trooper

1

İşte işe yarıyor:

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

değer, table_2 içindeki sütundur


1

Bunu birkaç kez yeniden yazmanız gerekiyorsa, bir kez yaptığım gibi yapabilirsiniz. Sütunlarınızın adlarını excel sayfasındaki satırlara alın (notepad ++ ile kolay olan her sütun adının (=) sonuna yazın) sağ taraftaki değerinizi kopyalamak ve yapıştırmak için bir sütun oluşturun her sütun. Daha sonra bağımsız bir sütunda sağdaki virgülleri tasarlandığı gibi koyun

Ardından, değerlerinizi her seferinde orta sütuna kopyalamanız, ardından yapıştırmanız ve çalıştırmanız gerekir.

Daha kolay bir çözüm bilmiyorum


0

Bu tür bir soruyu nasıl ele aldığımı sizinle paylaşmak istiyorum. Tablo2 sonucu dinamik olduğundan ve sütun numaraları tablo1'den daha küçük olabileceğinden durumum biraz farklı. Fakat konsept aynı.

İlk olarak, table2 sonucunu alın.

resim açıklamasını buraya girin

Ardından, açın.

resim açıklamasını buraya girin

Ardından dinamik SQL kullanarak güncelleme sorgusunu yazın. 2 basit tabloyu test etmek için örnek kod yazılmıştır - tblA ve 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 sonuç:

resim açıklamasını buraya girin


-3

Bunu MySql'de yaptım ve tek bir kayıtta birden çok sütun güncelledi, bu nedenle sunucunuz olarak MySql kullanıyorsanız bunu deneyin:

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

Ancak, vb.net MySql sunucusu kullanarak kodlama, ancak sunucu olarak MySql kullandığınız kadar favori programlama dilinize alabilirsiniz.



-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
Lütfen ne yaptığını açıklamak için cevabınıza biraz yorum ekleyin. Şu anda bu düşük kaliteli bir yanıt olarak işaretlenir ve geliştirilmedikçe silinir.
Ian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.