SQL UPDATE किसी स्तंभ को संबंधित स्तंभ द्वारा संदर्भित तालिका में मान के बराबर होना चाहिए?


112

मुझे उम्मीद है कि समझ में आया, मुझे विस्तृत करने दें:

एक क्विज़ प्रोग्राम के लिए ट्रैकिंग डेटा की एक तालिका होती है, जहाँ प्रत्येक पंक्ति होती है।

QuestionID और AnswerID (प्रत्येक के लिए एक तालिका है)। इसलिए बग के कारण NULL के लिए सेट किए गए QuestionIDs का एक समूह था, लेकिन संबंधित AnswerID का QuestionID उत्तर तालिका में है।

तो मान लें कि प्रश्नाकुल पूर्ण है और आंसर की 500 है, यदि हम उत्तर तालिका में जाते हैं और आंसर की 500 पाते हैं तो प्रश्नवाचक के साथ एक स्तंभ है जो कि होना चाहिए था जहां NULL मान है।

इसलिए मूल रूप से मैं प्रत्येक NULL QuestionID को सेट करना चाहता हूं कि वह उत्तर-तालिका के उत्तर पंक्ति पर मौजूद प्रश्नवाचक के समान हो, जो कि ट्रैकिंग्स तालिका में हो (उसी पंक्ति जो NULL QuestionID के रूप में लिखी जा रही है)।

यह मैं कैसे करूंगा?

UPDATE QuestionTrackings
SET QuestionID = (need some select query that will get the QuestionID from the AnswerID in this row)
WHERE QuestionID is NULL AND ... ?

यकीन नहीं होता कि मैं इसे मिलान करने वाले आंसर की से क्विड को क्विड कैसे बना पाऊंगा ...


MySQL और Microsoft SQL सर्वर मल्टी-टेबल UPDATE का समर्थन करने के लिए SQL सिंटैक्स में प्रत्येक समर्थन एक्सटेंशन। अन्य ब्रांड नहीं। आपने यह नहीं कहा है कि आप किस ब्रांड के डेटाबेस का उपयोग कर रहे हैं।
बिल कार्विन

जवाबों:


171
update q
set q.QuestionID = a.QuestionID
from QuestionTrackings q
inner join QuestionAnswers a
on q.AnswerID = a.AnswerID
where q.QuestionID is null -- and other conditions you might want

मैं यह जांचने की सलाह देता हूं कि अपडेट को चलाने से पहले अपडेट करने के लिए सेट किया गया परिणाम क्या है (एक ही प्रश्न, बस एक चयन के साथ):

select *
from QuestionTrackings q
inner join QuestionAnswers a
on q.AnswerID = a.AnswerID
where q.QuestionID is null -- and other conditions you might want

विशेष रूप से कि क्या प्रत्येक उत्तर आईडी में केवल 1 संबद्ध प्रश्न आईडी है।


7
मुझे यकीन नहीं है, लेकिन यह मेरे लिए काम नहीं करता है, हालांकि यह करता है: update QuestionTrackings q inner join QuestionAnswers a on q.AnswerID = a.AnswerID set q.QuestionID = a.QuestionID; एक अलग क्रम में एक ही मूल प्रश्न लगता है। किसी भी विचार क्यों?
बिलिन्हा

2
@ बिलीनोहा, ORA-00971: ओरेकल में SET कीवर्ड लापता
8

2
MySQL पर PhpMyAdmin में एक समान स्थिति के साथ एक समस्या है। मेरे मामले में, स्रोत और गंतव्य स्तंभ एक ही तालिका में हैं, लेकिन रिकॉर्ड चयन दूसरी तालिका पर आधारित है। क्वेरी का "सेलेक्ट" संस्करण काम करता है, लेकिन अपडेट स्टेटमेंट "FROM"
2NinerRomeo

3
मैंने "FROM" को समाप्त करके अपनी समस्या को खत्म कर दिया, यह इस तरह दिखाई दिया:UPDATE table1 NATURAL JOIN table2 SET table1.col1 = table1.col2 WHERE table2.col3 ="condition"
2NinerRomeo

क्या उत्तर "शाब्दिक प्रश्न" से "q" शाब्दिक क्वेरी पैरामीटर है या यह सिर्फ टेबल के नाम के लिए आपका शॉर्टहैंड है?
शॉन

28

अपडेट-एंड-जॉइन नोटेशन (सभी DBMS समर्थन नहीं है) के बिना, उपयोग करें:

UPDATE QuestionTrackings
   SET QuestionID = (SELECT QuestionID
                        FROM AnswerTrackings
                        WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)
   WHERE QuestionID IS NULL
     AND EXISTS(SELECT QuestionID
                        FROM AnswerTrackings
                        WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)

अक्सर इस तरह के एक प्रश्न में, आपको एक प्रश्न के साथ WHERE क्लॉज को अर्हता प्राप्त करने की आवश्यकता होती है जिसमें उप-क्वेरी शामिल होती है। यह UPDATE को उन पंक्तियों पर रौंदने से रोकता है जहाँ कोई मेल नहीं है (आमतौर पर सभी मानों को शून्य करने के लिए)। इस मामले में, चूंकि एक लापता प्रश्न आईडी NULL को NULL में बदल देगा, इसलिए यकीनन इससे कोई फर्क नहीं पड़ता।


इस विधि ने मेरे लिए Oracle 12c (जहां अपडेट-जॉइन मेथड फेल हो गया) पर काम किया।
shwartz

16

मुझे नहीं पता कि क्या आप MySQL वर्कबेंच पर मुझसे एक ही समस्या में चले गए हैं, लेकिन कथन के INNER JOINबाद FROMमेरे लिए काम नहीं कर रहा है। मैं क्वेरी को चलाने में असमर्थ था क्योंकि प्रोग्राम ने इसके बारे में शिकायत की थीFROM स्टेटमेंट के ।

इसलिए क्वेरी काम करने के लिए मैंने इसे बदल दिया

UPDATE table1 INNER JOIN table2 on table1.column1 = table2.column1
SET table1.column2 = table2.column4
WHERE table1.column3 = 'randomCondition';

के बजाय

UPDATE a
FROM table1 a INNER JOIN table2 b on a.column1 = b.column1
SET a.column2 = b.column4
WHERE a.column3 = 'randomCondition';

मुझे लगता है कि मेरा समाधान MySQL के लिए सही वाक्यविन्यास है।


हाँ, ऐसा लगता है कि माईसकल के लिए, JOIN को एक क्वेरी के 'table_references' भाग का हिस्सा माना जाता है। MySQL Join
AWP

12
UPDATE
    "QuestionTrackings"
SET
    "QuestionID" = (SELECT "QuestionID" FROM "Answers" WHERE "AnswerID"="QuestionTrackings"."AnswerID")
WHERE
    "QuestionID" is NULL
AND ...

1
मेरे लिए तांडव पर काम किया। @ एग्लेसियस का जवाब नहीं था।
लोम्बास

7

मैं एक ही सवाल कर रहा था। यहाँ एक काम कर समाधान है जो एगेलियस के समान है। मैं postgresql का उपयोग कर रहा हूं।

UPDATE QuestionTrackings
SET QuestionID = a.QuestionID
FROM QuestionTrackings q, QuestionAnswers a
WHERE q.QuestionID IS NULL

यह शिकायत करता है यदि पंक्ति 1 में तालिका नाम के स्थान पर q का उपयोग किया गया था, और पंक्ति 2 में प्रश्नावली से पहले कुछ भी नहीं होना चाहिए।


3
 select p.post_title,m.meta_value sale_price ,n.meta_value   regular_price
    from  wp_postmeta m 
    inner join wp_postmeta n
      on m.post_id  = n.post_id
    inner join wp_posts p
      ON m.post_id=p.id 
    and m.meta_key = '_sale_price'
    and  n.meta_key = '_regular_price'
     AND p.post_type = 'product';



 update  wp_postmeta m 
inner join wp_postmeta n
  on m.post_id  = n.post_id
inner join wp_posts p
  ON m.post_id=p.id 
and m.meta_key = '_sale_price'
and  n.meta_key = '_regular_price'
 AND p.post_type = 'product'
 set m.meta_value = n.meta_value;

3

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

तालिका 1 a, तालिका 2 b सेट करें a.coloumn = b.coloumn जहां a.id =.id है


1

1 तालिका में 2 तालिका डेटा अपडेट करें SET से पहले इनर में शामिल होने की आवश्यकता है:

`UPDATE `table1` INNER JOIN `table2` ON `table2`.`id`=`table1`.`id` SET `table1`.`name`=`table2`.`name`, `table1`.`template`=`table2`.`template`;

1

नीचे mysql के लिए काम करता है

update table1 INNER JOIN table2 on table1.col1 =  table2.col1
set table1.col1 =  table2.col2

0

मुझे लगता है कि यह काम करना चाहिए।

UPDATE QuestionTrackings
SET QuestionID = (SELECT QuestionID
                  FROM AnswerTrackings
                  WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)
WHERE QuestionID IS NULL
AND AnswerID IS NOT NULL;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.