sql डेटाबेस - एसक्यूएल में जॉइन के साथ मैं एक अद्यतन स्टेटमेंट कैसे कर सकता हूं?




का प्रणाली (12)

मुझे इस तालिका को SQL Server 2005 अपने 'पैरेंट' तालिका से डेटा के साथ अपडेट करने की आवश्यकता है, नीचे देखें:

बिक्री

id (int)
udid (int)
assid (int)

उद

id  (int)
assid  (int)

sale.assid में sale.assid को अपडेट करने के लिए सही मान होता है।

यह क्या प्रश्न करेगा? मैं एक join सोच रहा हूं लेकिन मुझे यकीन नहीं है कि यह संभव है।


Answers

FROM कीवर्ड के साथ निम्न कथन का उपयोग शामिल होने के साथ कई पंक्तियों को अपडेट करने के लिए किया जाता है

UPDATE users 
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division

PostgreSQL :

CREATE TABLE ud (id integer, assid integer);
CREATE TABLE sales (id integer, udid integer, assid integer);

UPDATE ud
SET assid = sales.assid
FROM sales
WHERE sales.id = ud.id;

यह SQL सर्वर में काम करना चाहिए:

update ud 
set assid = sale.assid
from sale
where sale.udid = id

UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID

सिंटेक्स सख्ती से निर्भर करता है कि आप किस SQL ​​डीबीएमएस का उपयोग कर रहे हैं। एएनएसआई / आईएसओ (उर्फ किसी भी एसक्यूएल डीबीएमएस पर काम करना चाहिए), MySQL, SQL सर्वर, और ओरेकल में ऐसा करने के कुछ तरीके यहां दिए गए हैं। सलाह दीजिये कि मेरा सुझाया गया एएनएसआई / आईएसओ विधि आमतौर पर अन्य दो तरीकों से बहुत धीमी होगी, लेकिन यदि आप MySQL, SQL सर्वर, या ओरेकल के अलावा SQL DBMS का उपयोग कर रहे हैं, तो यह जाने का एकमात्र तरीका हो सकता है (उदाहरण के लिए यदि आपका एसक्यूएल डीबीएमएस MERGE समर्थन नहीं करता है):

एएनएसआई / आईएसओ:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

माई एसक्यूएल:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

एस क्यू एल सर्वर:

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

आकाशवाणी:

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

जॉइन -िंग एकाधिक तालिकाओं का उपयोग करके सरलीकृत अद्यतन क्वेरी।

   UPDATE
        first_table ft
        JOIN second_table st ON st.some_id = ft.some_id
        JOIN third_table tt  ON tt.some_id = st.some_id
        .....
    SET
        ft.some_column = some_value
    WHERE ft.some_column = 123456 AND st.some_column = 123456

नोट - first_table, second_table, third_table और 123456 जैसे some_column डेमो टेबल नाम, कॉलम नाम और आईडी हैं। उन्हें वैध नामों के साथ बदलें।


postgres

UPDATE table1
SET    COLUMN = value
FROM   table2,
       table3
WHERE  table1.column_id = table2.id
       AND table1.column_id = table3.id
       AND table1.COLUMN = value
       AND table2.COLUMN = value
       AND table3.COLUMN = value 

और एमएस एक्सेस में:

UPDATE ud 
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;

एक मानक एसक्यूएल दृष्टिकोण होगा

UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)

SQL सर्वर पर आप एक जॉइन का उपयोग कर सकते हैं

UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id

एक और उदाहरण क्यों एसक्यूएल वास्तव में पोर्टेबल नहीं है।

MySQL के लिए यह होगा:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

अधिक जानकारी के लिए एकाधिक तालिका अद्यतन पढ़ें: http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]

मैं सोच रहा था कि शीर्ष पोस्ट में एसक्यूएल-सर्वर एक सिबेज के लिए काम करेगा क्योंकि वे दोनों टी-एसक्यूएल हैं लेकिन दुर्भाग्य से नहीं।

Sybase के लिए मैंने पाया कि अद्यतन तालिका पर ही होना चाहिए उपनाम नहीं:

update ud
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

जैसा कि @ माइक रिटाको द्वारा उल्लेख किया गया है लेकिन एसएसएमएस 2008 आर 2 के लिए अपडेट किया गया है

  1. डेटाबेस नाम पर राइट क्लिक करें
  2. कार्य> स्क्रिप्ट जेनरेट करें चुनें
  3. आपकी सेटिंग्स के आधार पर परिचय पृष्ठ दिखाया जा सकता है या नहीं
  4. 'विशिष्ट डेटाबेस ऑब्जेक्ट्स का चयन करें' चुनें,
  5. पेड़ दृश्य का विस्तार करें और प्रासंगिक तालिकाओं की जांच करें
  6. अगला पर क्लिक करें
  7. उन्नत क्लिक करें
  8. सामान्य अनुभाग के तहत, 'डेटा के प्रकार के प्रकार' के लिए उपयुक्त विकल्प चुनें
  9. जादूगर को पूरा करें

फिर आप एसएसएमएस से सीधे डेटा के लिए सभी INSERT कथन प्राप्त करेंगे।

2016-10-25 संपादित करें एसक्यूएल सर्वर 2016 / एसएसएमएस 13.0.15900.1

  1. डेटाबेस नाम पर राइट क्लिक करें

  2. कार्य> स्क्रिप्ट जेनरेट करें चुनें

  3. आपकी सेटिंग्स के आधार पर परिचय पृष्ठ दिखाया जा सकता है या नहीं

  4. 'विशिष्ट डेटाबेस ऑब्जेक्ट्स का चयन करें' चुनें,

  5. पेड़ दृश्य का विस्तार करें और प्रासंगिक तालिकाओं की जांच करें

  6. अगला पर क्लिक करें

  7. उन्नत क्लिक करें

  8. सामान्य अनुभाग के तहत, 'डेटा के प्रकार के प्रकार' के लिए उपयुक्त विकल्प चुनें

  9. ओके पर क्लिक करें

  10. चुनें कि क्या आप आउटपुट को एक नई क्वेरी, क्लिपबोर्ड या फ़ाइल पर जाना चाहते हैं

  11. दो बार अगला क्लिक करें

  12. आपकी स्क्रिप्ट आपके द्वारा उठाई गई सेटिंग्स के अनुसार तैयार की जाती है

  13. समाप्त क्लिक करें





sql sql-server tsql sql-server-2005 sql-update