SQL में कई कॉलम अपडेट करें


166

क्या एसक्यूएल सर्वर में कई कॉलम अपडेट करने का एक तरीका है जिस तरह से एक इंसर्ट स्टेटमेंट का उपयोग किया जाता है?

कुछ इस तरह:

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+ कॉलम हैं, तो यह लिखना काफी थकाऊ हो सकता है।


यह सुनने में काफी
त्रुटीपूर्ण

यदि आप इसे प्रोग्रामिक रूप से कर रहे हैं, तो पैरामीटर किए गए प्रश्नों का उपयोग करें और आपको केवल इसे एक बार लिखना होगा। यदि आप इसे मैन्युअल रूप से कर रहे हैं, तो SQL प्रबंधन स्टूडियो के संपादक का उपयोग करें और क्वेरी लिखने के बजाय सीधे पंक्ति में डेटा दर्ज करें।
डैन बेचर

जवाबों:


89

"थकाऊ तरीका" मानक SQL है और मुख्य धारा RDBMS इसे कैसे करते हैं।

100+ कॉलम के साथ, आपको ज्यादातर डिज़ाइन की समस्या है ... साथ ही, क्लाइंट टूल्स (जैसे जनरेशन स्टेटमेंट स्टेटमेंट) में या ORMs का उपयोग करके mitigating तरीके हैं


5
तो MSSQL में ऐसा करने का कोई अन्य तरीका नहीं है?
जो

4
@ जो: नहीं। एलेक्स के नीचे से जवाब देखें ( stackoverflow.com/a/9079904/27535 ), इसे जोड़ने के लिए MS से अनुरोध है
gbn

मुझे लगता है कि 1keydata.com/sql/sqlupdate.html "SET column_1 = [[value1], column_2 = [value2]" का उपयोग करें
DeLe

फिर से सहमत हूं। सामान्य शब्दों में डिज़ाइन की समस्या लेकिन ऐसी परिस्थितियाँ हैं जहाँ थोक सत्यापन / डेटा सफाई की आवश्यकता हो सकती है। मैं वर्तमान में ऐसा करने में संलग्न हूं और SQL Server 2012 में अब आप नीचे दिए गए 1 कॉलम प्रति @ जौन वू उत्तर से अधिक अपडेट कर सकते हैं।
हिलेरी

201

इसे इस्तेमाल करे:

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

ओरेकल को छोड़कर अधिकांश SQL बोलियों में काम करना चाहिए।

और हाँ - यह बहुत टाइपिंग है - यह एसक्यूएल ऐसा करता है।


4
यह Oracle में काम नहीं करेगा: docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
राफेल

16
नमस्ते। आपका सही है, लेकिन मैं सिर्फ यह बताना चाहता था कि यह किसी भी SQL बोली में काम नहीं करेगा।
राफेल

3
MySQL पर काम करता है।
जोओ फरियास


19

आपकी क्वेरी लगभग सही है। इसके लिए T-SQL है:

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

मुझे संदेह है कि ओपी ने केवल एक उपनाम का इस्तेमाल किया क्योंकि सवाल वाक्यविन्यास की शुद्धता के बारे में नहीं है, लेकिन इस वाक्यविन्यास में "क्यों" है। व्यक्तिगत रूप से, मैं एलियासेस का उपयोग करना पसंद करता हूं, जैसे मैंने यहां किया था: 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 का उपयोग करके परीक्षण) के लिए ठीक काम करने लगता है।
तेलमो ट्रॉपर


1

यदि आपको इसे कई बार री-टाइप करना है, तो आप ऐसा कर सकते हैं जैसे मैंने एक बार किया था। एक्सेल शीट में अपने कॉलमों के नाम पंक्तियों में दर्ज करें (प्रत्येक कॉलम नाम के अंत में लिखें (=) जो नोटपैड ++ में आसान है) दाईं ओर एक कॉलम बनाते हैं जो आपके मूल्य को कॉपी और पेस्ट करता है जो नई प्रविष्टियों के अनुरूप होंगे प्रत्येक स्तंभ। फिर एक स्वतंत्र कॉलम में उनके दाईं ओर कॉमा को डिज़ाइन के अनुसार रखा गया

फिर आपको हर बार बीच के कॉलम में अपने मूल्यों को कॉपी करना होगा और उसके बाद बस पेस्ट करना होगा

मैं एक आसान समाधान नहीं जानता


0

मैं आपके साथ साझा करना चाहता हूं कि मैं इस तरह के प्रश्न को कैसे संबोधित करूं। मेरा मामला थोड़ा अलग है क्योंकि तालिका 2 का परिणाम गतिशील है और स्तंभ संख्या तालिका 1 से कम हो सकती है। लेकिन अवधारणा एक ही है।

सबसे पहले, तालिका 2 का परिणाम प्राप्त करें।

यहां छवि विवरण दर्ज करें

इसके बाद, इसे अनपाइव करें।

यहां छवि विवरण दर्ज करें

फिर डायनेमिक 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 & "'". 

हालाँकि, मैं Mybql सर्वर का उपयोग करके vb.net में कोडिंग कर रहा था, लेकिन आप इसे अपनी पसंदीदा प्रोग्रामिंग भाषा में ले जा सकते हैं जहाँ तक आप 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
कृपया अपने उत्तर में कुछ टिप्पणी जोड़ें कि वह क्या कर रहा है। फिलहाल इसे कम गुणवत्ता वाले उत्तर के रूप में चिह्नित किया गया है और जब तक इसमें सुधार नहीं किया जाएगा।
इयान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.