Sql सर्वर में सबक्वेरी का उपयोग करके क्वेरी अपडेट करें


83

मेरे पास इस तरह की एक सरल तालिका संरचना है:

तालिका अस्थायी

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║    80 ║
║ Ravi     ║    85 ║
║ Sanjay   ║    90 ║
╚══════════╩═══════╝

और मेरे पास एक और टेबल के नाम भी हैं जैसे कि tempDataView

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Ravi     ║       ║
║ Ravi     ║       ║
║ Sanjay   ║       ║
╚══════════╩═══════╝

मैं तालिका को अपडेट करना चाहते tempDataView , की स्थापना करके मार्क्स के अनुसार tempDataView - नाम के साथ तुलना में tempData - नाम

हां मुझे आपको दिखाने दें कि मैंने क्या प्रयास किया, मैंने इसे कर्सर का उपयोग करके हल करने की कोशिश की और इसका पूरी तरह से हल किया, लेकिन मैं इसे सबक्वेरी का उपयोग करके हल करने का तरीका ढूंढ रहा हूं

यह रहा:

Declare @name varchar(50),@marks varchar(50)
Declare @cursorInsert CURSOR
set @cursorInsert = CURSOR FOR
Select name,marks from tempData
OPEN @cursorInsert
FETCH NEXT FROM @cursorInsert
into @name,@marks
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE tempDataView set marks = @marks where name = @name
FETCH NEXT FROM @cursorInsert
INTO @name,@marks
END
CLOSE @cursorInsert
DEALLOCATE @cursorInsert

वास्तव में यह मेरे लिए होमवर्क की तरह है कि इसे सबकुरी का उपयोग करके हल किया जाए।

जवाबों:


180

आप UPDATEबयानों पर भी दोनों तालिकाओं में शामिल हो सकते हैं ,

UPDATE  a
SET     a.marks = b.marks
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

तेज़ प्रदर्शन के लिए, दोनों तालिकाओं पर एक INDEXस्तंभ marksको परिभाषित करें ।

का उपयोग करते हुए SUBQUERY

UPDATE  tempDataView 
SET     marks = 
        (
          SELECT marks 
          FROM tempData b 
          WHERE tempDataView.Name = b.Name
        )

1
यह सही है। लेकिन कृपया मुझे उपकुंजी का उपयोग करके ऐसा करने का कोई भी तरीका सुझाएं।
नरेंद्र पाल

1
साथ जवाब अद्यतन subquery, लेकिन मैं नहीं बल्कि का उपयोग कर JOINसे SUBQUERY
जॉन वू

1
कॉलम INDEXपर किसी को क्यों परिभाषित करना चाहिए marks? क्या यह Nameस्तंभों पर नहीं होना चाहिए ?
lindelof

1
एक त्रुटि मिली: उपश्रेणी 1 से अधिक मूल्य पर लौटी। यह अनुमति नहीं है जब उपकुंजी का अनुसरण किया जाता है =; =; <, <=,>,> = या जब उपश्रेणी का उपयोग अभिव्यक्ति के रूप में किया जाता है।
प्रदीप

1
सबकुछ अपने आप करने की कोशिश करें और इसे तब तक समायोजित करें जब तक आपको केवल 1 परिणाम न मिल जाए। संभवतः बदल SELECTकरSELECT TOP 1
vahanpwns

33

क्योंकि आप अभी सीख रहे हैं, मैं आपको सुझाव देता हूं कि आप SELECT जॉन्स को UPDATE या DELETE जॉइन में परिवर्तित करने का अभ्यास करें। पहले मेरा सुझाव है कि आप इन दो तालिकाओं में शामिल होने वाले एक सेलेक्ट स्टेटमेंट को जनरेट करें

SELECT *
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

फिर ध्यान दें कि हमारे पास दो टेबल अलायस aऔर हैं b। इन उपनामों का उपयोग करके आप आसानी से अद्यतन कर सकते हैं अपडेट विवरण या तो तालिका या बी। तालिका के लिए आपके पास JW द्वारा प्रदान किया गया उत्तर है। यदि आप अपडेट करना चाहते हैं b, तो कथन होगा:

UPDATE  b
SET     b.marks = a.marks
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

अब, स्टेटमेंट को DELETE स्टेटमेंट में बदलने के लिए उसी अप्रोच का उपयोग करें। नीचे दिए गए विवरण aकेवल उन नामों के लिए (बी अक्ष को छोड़कर) से हटेंगे जो नाम से मेल खाते हैं:

DELETE a
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

आप जेडब्ल्यू द्वारा बनाए गए एसक्यूएल फिडेल को खेल के मैदान के रूप में उपयोग कर सकते हैं


5
सीखने का सही तरीका। +1 अध्ययन के लिए रास्ता दिखाने के लिए। धन्यवाद
नरेंद्र पाल

3

यहाँ मेरे नमूने में मुझे इसका समाधान पता चला है, क्योंकि मुझे अपडेट और सबक्वेरी के साथ एक ही समस्या थी:

UPDATE
    A
SET
    A.ValueToChange = B.NewValue
FROM
    (
        Select * From C
    ) B
Where 
    A.Id = B.Id

1
इस उत्तर के लिए धन्यवाद! इसे पढ़ने में दूसरों की मदद करने के लिए, क्या आप जल्दी से एक स्पष्टीकरण जोड़ सकते हैं कि यह कोड समस्या का हल क्यों करता है?
RedBassett

0

इस थ्रेड का शीर्षक पूछता है कि एक अपडेट में सबक्वेरी का उपयोग कैसे किया जा सकता है। यहाँ उस का एक उदाहरण है:

update [dbName].[dbo].[MyTable] 
set MyColumn = 1 
where 
    (
        select count(*) 
        from [dbName].[dbo].[MyTable] mt2 
        where
            mt2.ID > [dbName].[dbo].[MyTable].ID
            and mt2.Category = [dbName].[dbo].[MyTable].Category
    ) > 0

मुझे यकीन नहीं है कि यह कैसे भी संकलित होगा, गिनती (*) के लिए कोई समूह नहीं है कि क्या पता किया जाए।
crthompson

@paqogomez बस इसे आज़माएं - किसी भी मेज पर जिसमें इसका कोई रिकॉर्ड हो। ई, जी। EventLog से गिनती (*) का चयन करें जहां वर्ष = 2018
ग्राहम लाईट

तो आप बस पूरी तालिका की गिनती कर रहे हैं। मैं अपने डाउन वोट से खड़ा हुआ हूं, इसका सवाल (शीर्षक की परवाह किए बिना) से कोई लेना
देना नहीं है

यह आपका विशेषाधिकार है, लेकिन इस थ्रेड का शीर्षक "सबक्वेरी का उपयोग करके क्वेरी को अपडेट करना" है, और मेरा उदाहरण स्वयं स्पष्ट रूप से यही करता है। fyi मैं "संपूर्ण तालिका" की गिनती नहीं कर रहा हूं - गिनती (*) के बाद "जहां" खंड है - इसलिए यह "जहां" स्थिति को पूरा करने वाली पंक्तियों को गिन रहा है।
ग्राहम लाईट

0

यहां कुछ उदाहरणों के साथ अपडेट ऑपरेशन का अच्छा विवरण दिया गया है। हालाँकि यह Postgres साइट है, लेकिन SQL क्वेरीज़ अन्य DBs के लिए भी मान्य हैं। निम्नलिखित उदाहरण समझने के लिए सहज हैं।

-- Update contact names in an accounts table to match the currently assigned salesmen:

UPDATE accounts SET (contact_first_name, contact_last_name) =
    (SELECT first_name, last_name FROM salesmen
     WHERE salesmen.id = accounts.sales_id);

-- A similar result could be accomplished with a join:

UPDATE accounts SET contact_first_name = first_name,
                    contact_last_name = last_name
  FROM salesmen WHERE salesmen.id = accounts.sales_id;

हालाँकि, दूसरी क्वेरी अप्रत्याशित परिणाम दे सकती है यदि salesmen.id एक अद्वितीय कुंजी नहीं है, जबकि पहली क्वेरी की गारंटी एक त्रुटि को बढ़ाने के लिए है जब कई आईडी मिलान होते हैं। इसके अलावा, यदि किसी विशेष खातों के लिए कोई मेल नहीं है। Sales_id प्रविष्टि, पहली क्वेरी NULL के लिए संबंधित नाम फ़ील्ड सेट करेगा, जबकि दूसरा क्वेरी उस पंक्ति को बिल्कुल भी अपडेट नहीं करेगा।

इसलिए दिए गए उदाहरण के लिए, सबसे विश्वसनीय क्वेरी निम्न की तरह है।

UPDATE tempDataView SET (marks) =
    (SELECT marks FROM tempData
     WHERE tempDataView.Name = tempData.Name);

दुर्भाग्य से पहला रूप MS SQL सर्वर में काम नहीं करता है।
एंटोनील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.