सवाल मैं SQL सर्वर में किसी चयन से अद्यतन कैसे करूं?


में एस क्यू एल सर्वर, यह संभव है insert एक का उपयोग कर एक टेबल में SELECT बयान:

INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3 
FROM other_table 
WHERE sql = 'cool'

क्या यह भी संभव है अद्यतन करें के ज़रिए SELECT? मेरे पास मान युक्त एक अस्थायी तालिका है, और उन मानों का उपयोग करके एक और तालिका अपडेट करना चाहूंगा। शायद इस तरह कुछ:

UPDATE Table SET col1, col2
SELECT col1, col2 
FROM other_table 
WHERE sql = 'cool'
WHERE Table.id = other_table.id

3038
2018-02-25 14:36


मूल


एंडी की टिप्पणी पूरी तरह मान्य है। मैंने अपनी mysql वेबसाइट को हाल ही में पीडीओ में परिवर्तित कर दिया है कि मैं इंजेक्शन हमलों से किसी भी तरह से सुरक्षित था। यह केवल प्रक्रिया के दौरान था, मुझे एहसास हुआ कि मेरे कुछ एसक्यूएल स्टेटमेंट अभी भी उपयोगकर्ता इनपुट का उपयोग करके बनाए गए थे। मैंने फिर तैयार बयानों का उपयोग करके तय किया। एक पूर्ण नौसिखिया के लिए, यह पूरी तरह से स्पष्ट नहीं है कि एक अंतर है क्योंकि कई विशेषज्ञ पीडीओ का उपयोग करने के बारे में टिप्पणी फेंकते हैं लेकिन टी निर्दिष्ट नहीं करते हैं - Zafar Kurbonov


जवाब:


UPDATE
    Table_A
SET
    Table_A.col1 = Table_B.col1,
    Table_A.col2 = Table_B.col2
FROM
    Some_Table AS Table_A
    INNER JOIN Other_Table AS Table_B
        ON Table_A.id = Table_B.id
WHERE
    Table_A.col3 = 'cool'

4463
2018-02-25 14:39



यदि आप तालिकाओं के बीच लिंक संपादित कर रहे हैं (SET Table.other_table_id = @NewValue) फिर ऑन कथन को कुछ इस तरह बदलें ON Table.id = @IdToEdit AND other_table.id = @NewValue - Trisped
क्या यह गायब नहीं है WHERE सवाल में खंड? मेरे पास इस प्रणाली पर इसका परीक्षण करने के लिए सर्वर नहीं है लेकिन आप इसे जोड़ने में सक्षम नहीं होंगे ON पसंद: ON Table.id = other_table.id AND other_table.sql='cool'? या क्या मैं इस सवाल का गलत व्याख्या कर रहा हूं? - J V
यह INNER जॉइन पर फिर से शुरू करने के लिए अद्यतन का उपयोग करके काम करता है। जैसे कि आपके WHERE क्लॉज के रूप में ऑन फ़ंक्शन और इनर जॉइन रिकॉर्ड्स रिकॉर्ड जो जॉइन टेबल में नहीं मिलते हैं। WHERE क्लॉज जोड़ना जॉइन टेबल के परिणाम सेट को भी सीमित कर देगा। @ रोगर रे MySQL का कौन सा संस्करण और आपकी क्वेरी क्या थी, क्योंकि यह बताए गए अनुसार कार्य करता है। - fyrye
@RogerRay, यह प्रश्न माइक्रोसॉफ्ट एसक्यूएल सर्वर के बारे में है। दुर्भाग्य से, विभिन्न एसक्यूएल कार्यान्वयन के बीच वाक्यविन्यास भिन्न हो सकता है। - Charles Wood
कुछ हद तक संबंधित, मैं अक्सर अपने अद्यतन प्रश्नों को पहले चयन कथन के रूप में लिखना पसंद करता हूं ताकि मैं डेटा देख सकूं जो निष्पादित करने से पहले अपडेट किया जाएगा। हाल ही में ब्लॉग पोस्ट में सेबेस्टियन इस के लिए एक तकनीक शामिल है: sqlity.net/en/2867/update-from-select - dennislloydjr


SQL सर्वर 2008 (या बेहतर) में, उपयोग करें MERGE

MERGE INTO YourTable T
   USING other_table S 
      ON T.id = S.id
         AND S.tsql = 'cool'
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;

वैकल्पिक रूप से:

MERGE INTO YourTable T
   USING (
          SELECT id, col1, col2 
            FROM other_table 
           WHERE tsql = 'cool'
         ) S
      ON T.id = S.id
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;

672
2017-09-09 09:40



MERGE "अप्सर्टिंग" रिकॉर्ड के लिए भी इस्तेमाल किया जा सकता है; अर्थात्, UPDATE यदि मिलान रिकॉर्ड मौजूद है, INSERT कोई रिकॉर्ड नहीं मिला तो नया रिकॉर्ड - brichins
यह समकक्ष अद्यतन से लगभग 10x तेज था ... मेरे लिए बयान में शामिल हों। - Paul Suart
मरने के लिए भी इस्तेमाल किया जा सकता है। लेकिन मेर्ज के साथ सावधान रहें क्योंकि टैर्गेट टेबल रिमोट टेबल नहीं हो सकती है। - Möoz
बग मर्ज करें: mssqltips.com/sqlservertip/3074/... - Simon D
@ सिमोनडी: किसी भी SQL सर्वर कीवर्ड को चुनें और आपको बग मिलेगी। तुम्हारी बात? मैं डरता हूं कि वहां और अधिक बग (और अधिक मौलिक भी) हैं UPDATE से MERGE, लोगों ने अभी उनके साथ रहने के लिए सीखा है और वे परिदृश्य ('फीचर्स') का हिस्सा बन गए हैं। गौर करें कि जब ब्लॉग मौजूद नहीं थे UPDATE ब्लॉक पर नया बच्चा था। - onedaywhen


UPDATE table 
SET Col1 = i.Col1, 
    Col2 = i.Col2 
FROM (
    SELECT ID, Col1, Col2 
    FROM other_table) i
WHERE 
    i.ID = table.ID

524
2018-01-22 17:47



अब तक सबसे सरल! हालांकि आपका लापता है आईडी आंतरिक चयन से क्षेत्र। काम करने के लिए आपको WHERE क्लॉज के लिए इसकी आवश्यकता होगी - John Doherty
यह लगभग सभी डीबीएमएस में काम करेगा, जिसका मतलब है कि एक बार सीखना, हर जगह निष्पादित करना। यदि प्रदर्शन से आपके लिए यह अधिक महत्वपूर्ण है तो आप यह जवाब पसंद कर सकते हैं, खासकर यदि आपका अपडेट कुछ डेटा को सही करने के लिए एक है। - Alan Macdonald
@ dotnetN00b stackoverflow.com/a/2334741/206730 तुम्हारे लिए अच्छा नहीं है? - Kiquenet


मैं संशोधित करूंगा रॉबिन का उत्कृष्ट जवाब निम्नलिखित के लिए:

UPDATE Table
SET Table.col1 = other_table.col1,
 Table.col2 = other_table.col2
FROM
    Table
INNER JOIN other_table ON Table.id = other_table.id
WHERE
    Table.col1 != other_table.col1
OR Table.col2 != other_table.col2
OR (
    other_table.col1 IS NOT NULL
    AND Table.col1 IS NULL
)
OR (
    other_table.col2 IS NOT NULL
    AND Table.col2 IS NULL
)

एक WHERE खंड के बिना, आप उन पंक्तियों को भी प्रभावित करेंगे जिन्हें प्रभावित करने की आवश्यकता नहीं है, जो संभवतः सूचकांक पुनर्मूल्यांकन या आग ट्रिगर्स का कारण बन सकता है जो वास्तव में नहीं निकाला जाना चाहिए था।


253
2017-09-08 21:20



ऐसा लगता है कि कॉलम में से कोई भी शून्य नहीं है। - Martin Smith
तुम सही हो, मैं हाथ से उदाहरण टाइप कर रहा था। मैंने उस सौदे से निपटने के लिए कहां से एक तीसरा और चौथा खंड जोड़ा है। - quillbreaker
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2)) अधिक संक्षेप में है। - Martin Smith
क्या बयान में इन दोनों को खंड में शामिल नहीं किया जाना चाहिए? (other_table.col1 शून्य है और table.col1 शून्य नहीं है) या (other_table.col2 शून्य है और table.col2 शून्य नहीं है) - Barka
इस पर निर्भर करता है कि क्या आप स्रोत से नल के साथ गंतव्य में नल को प्रतिस्थापित करना चाहते हैं। अक्सर, मैं नहीं करता। लेकिन यदि आप करते हैं, तो मार्टिन का निर्माण जहां क्लॉज का उपयोग करने के लिए सबसे अच्छी बात है। - quillbreaker


एक रास्ता

UPDATE t 
SET t.col1 = o.col1, 
    t.col2 = o.col2
FROM 
    other_table o 
  JOIN 
    t ON t.id = o.id
WHERE 
    o.sql = 'cool'

180
2018-02-25 14:41





एक अन्य संभावना का अभी तक उल्लेख नहीं किया गया है कि वह सिर्फ चकित हो SELECT खुद को एक सीटीई में बयान दें और फिर सीटीई अपडेट करें।

;WITH CTE
     AS (SELECT T1.Col1,
                T2.Col1 AS _Col1,
                T1.Col2,
                T2.Col2 AS _Col2
         FROM   T1
                JOIN T2
                  ON T1.id = T2.id
         /*Where clause added to exclude rows that are the same in both tables
           Handles NULL values correctly*/
         WHERE EXISTS(SELECT T1.Col1,
                             T1.Col2
                       EXCEPT
                       SELECT T2.Col1,
                              T2.Col2))
UPDATE CTE
SET    Col1 = _Col1,
       Col2 = _Col2

इसका लाभ यह है कि इसे चलाने में आसान है SELECT सैनिटी के अपने पहले व्यक्ति पर बयान परिणाम की जांच करें, लेकिन इसके लिए आपको ऊपर दिए गए कॉलम को उपनाम करने की आवश्यकता होती है यदि उन्हें स्रोत और लक्ष्य तालिका में समान नाम दिया गया हो।

यह मालिकाना के समान सीमा भी है UPDATE ... FROM सिंटैक्स चार अन्य उत्तरों में दिखाया गया है। यदि स्रोत तालिका एक से कई लोगों के कई पक्षों पर है तो यह अनिश्चित है कि संभव मिलान में शामिल रिकॉर्ड का उपयोग किया जाएगा Update (एक मुद्दा है कि MERGE अगर एक ही पंक्ति को एक से अधिक पंक्तियों को अद्यतन करने का प्रयास किया जाता है तो त्रुटि उत्पन्न करके बचाता है)।


140
2017-11-06 00:18



क्या नाम का कोई अर्थ है CTE ? - Raptor
@ShivanRaptor - यह संक्षिप्त नाम है सामान्य टेबल अभिव्यक्ति। इस मामले में बस एक मनमाना उपनाम। - Martin Smith
यह कई सीटीई के साथ भी अच्छी तरह से काम करता है: ;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ... - VeeTheSecond


रिकॉर्ड के लिए (और दूसरों की तरह मैं खोज रहा था), आप इसे MySQL में ऐसा कर सकते हैं:

UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id

95
2017-10-05 14:20



यह अच्छी तरह से काम किया। मैंने उपरोक्त सभी प्रश्नों की कोशिश की, वे सभी एक या दूसरी तरह की त्रुटि देते हैं।
धन्यवाद! मुझे पता है कि यह पुराना है, लेकिन सिर्फ यह कहना चाहता था कि यह मेरे लिए काम करता है। मेरा सर्वर किसी अद्यतन विवरण में FROM का उपयोग करने की अनुमति नहीं देगा। तो FROM खंड से जुड़े सभी उत्तरों में एक वाक्यविन्यास त्रुटि लौटा दी। इस तरह से सही काम किया। बहुत सराहना की। - Todd Withers
यह इतनी बार क्यों उखाड़ फेंक दिया जाता है? यदि मैं सी # के लिए पूछता हूं तो मैं रिकॉर्ड रूबी कोड के लिए पोस्ट करता हूं तो वही होगा ... - isHuman
@isHuman जब आप मेरे-एसक्यूएल उत्तरों (और इसके विपरीत) की तलाश करते हैं तो एसक्यूएल-सर्वर प्रश्न में पहुंचना बहुत आम है। यह एक सी # प्रश्न में एक रूबी जवाब पोस्ट करने से पूरी तरह से अलग है। - Gabriel


उपनाम का उपयोग करना:

UPDATE t
   SET t.col1 = o.col1
  FROM table1 AS t
         INNER JOIN 
       table2 AS o 
         ON t.id = o.id

78
2018-05-23 13:06