2009-03-19 11 views
38

मैं पाठ्यक्रम संख्या 11.एसक्यूएल में मौजूदा पंक्ति से डेटा को मौजूदा पंक्ति में कॉपी करें?

डेटा की प्रत्येक पंक्ति में एक पाठ्यक्रम के लिए एक उपयोगकर्ता के लिए है के लिए के रूप में विशिष्ट पाठ्यक्रम के लिए ट्रैकिंग डेटा से भरा एक मेज, ज़ाहिर नंबर 6

नया ट्रैकिंग अब मैं जोड़ लिया है है , इसलिए पाठ्यक्रम 6 और पाठ्यक्रम 11 दोनों को आवंटित उपयोगकर्ताओं के लिए डेटा की दो पंक्तियां हैं।

ग्राहक उन सभी उपयोगकर्ताओं को चाहता है जिन्होंने 1 अगस्त 2008 के बाद किसी भी समय पाठ्यक्रम संख्या 6 पूरा कर लिया हो और पाठ्यक्रम 11 के लिए पूरा किया जा सके। हालांकि मैं केवल 6 से 11 को परिवर्तित नहीं कर सकता क्योंकि वे अपने पुराने डेटा को संरक्षित करना चाहते हैं पाठ्यक्रम 6.

इसलिए प्रत्येक पंक्ति के लिए 6 की पाठ्यक्रम संख्या के लिए पूर्ण रूप से चिह्नित किया गया है, और 1 अगस्त 2008 की तारीख से अधिक है, मैं उस पंक्ति पर पूरा डेटा लिखना चाहता हूं जिसमें पाठ्यक्रम के लिए ट्रैकिंग शामिल है 11 उस विशिष्ट उपयोगकर्ता के लिए।

मुझे पाठ्यक्रम 6 पंक्ति से पाठ्यक्रम 11 पंक्ति तक डेटा ले जाने की आवश्यकता होगी ताकि उपयोगकर्ता स्कोर और पोस्ट पूर्ण होने की तारीख को स्थानांतरित किया जा सके।

userID (int) 
courseID (int) 
course (bit) 
bookmark (varchar(100)) 
course_date (datetime) 
posttest (bit) 
post_attempts (int) 
post_score (float) 
post_date (datetime) 
complete (bit) 
complete_date (datetime) 
exempted (bit) 
exempted_date (datetime) 
exempted_reason (int) 
emailSent (bit) 

कुछ मान NULL हो जाएगा और उपयोगकर्ता ID/courseID स्पष्ट रूप से नहीं ले जाए, जैसा कि सही जगह में पहले से ही है:

यहाँ तालिका की संरचना है।

उत्तर

60

शायद मैं समस्या गलत पढ़ते हैं, लेकिन मेरा मानना ​​है कि आप पहले से ही पाठ्यक्रम 11 रिकॉर्ड डाला है और केवल उन है कि मापदंड आप कोर्स 6 के डेटा के साथ सूचीबद्ध पूरा अपडेट करना होगा।

यदि यह मामला है, तो आप एक UPDATE ... FROM बयान का उपयोग करना चाहेंगे:

UPDATE MyTable 
SET 
    complete = 1, 
    complete_date = newdata.complete_date, 
    post_score = newdata.post_score 
FROM 
    (
    SELECT 
     userID, 
     complete_date, 
     post_score 
    FROM MyTable 
    WHERE 
     courseID = 6 
     AND complete = 1 
     AND complete_date > '8/1/2008' 
    ) newdata 
WHERE 
    CourseID = 11 
    AND userID = newdata.userID 

See this related SO question for more info

+1

कोई मौका जो आप मुझे समझा सकते हैं कि नईडेटा चीज़ कैसे काम करती है, जो एक आसान चीज की तरह दिखती है लेकिन मुझे पूरा यकीन नहीं है कि मुझे यह – BigOmega

+0

मिल गया है, धन्यवाद! – BigOmega

+0

@Ryan क्या आपने इसे चलाया/सत्यापित किया? – eglasius

4

Use SELECT to Insert records

INSERT tracking (userID, courseID, course, bookmark, course_date, posttest, post_attempts, post_score, post_date, complete, complete_date, exempted, exempted_date, exempted_reason, emailSent) 
SELECT userID, 11, course, bookmark, course_date, posttest, post_attempts, post_score, post_date, complete, complete_date, exempted, exempted_date, exempted_reason, emailSent 
FROM tracking WHERE courseID = 6 AND course_date > '08-01-2008' 
+0

हम्म ठीक है, लेकिन मैं एक कहां है कि दोनों सम्मिलित करें और चयन की जाँच करता है ऐसा करने में सक्षम हो जाएगा जा रहा है कि यह वही तालिका में है? – BigOmega

+0

उदाहरण देने में सक्षम होना चाहिए, मैंने अभी कोशिश की है। –

+0

संभावित रूप से पूर्ण तिथि को पूरा_डेट को सेट करना चाहिए, अगर यह एक आवश्यकता है। हालांकि, आपको शुरू करना चाहिए। –

10
UPDATE c11 
SET 
    c11.completed= c6.completed, 
    c11.complete_date = c6.complete_date, 
-- rest of columns to be copied 
FROM courses c11 inner join courses c6 on 
    c11.userID = c6.userID 
    and c11.courseID = 11 and c6.courseID = 6 
    -- and any other checks 

मैं हमेशा एक अद्यतन के खंड से देखा है, सामान्य चयन में से एक की तरह। दरअसल यदि आप यह जांचना चाहते हैं कि अद्यतन चलाने से पहले क्या अपडेट किया जाएगा, तो आप एक अद्यतन सी 11 के साथ अद्यतन भागों को प्रतिस्थापित कर सकते हैं। *। लंगर बतख के जवाब पर मेरी टिप्पणियां देखें।

10

कॉपी उसी तालिका में किसी अन्य योग्य पंक्तियाँ (या अलग-अलग तालिकाओं) करने के लिए एक पंक्ति से एक मूल्य: 2 अद्वितीय संदर्भ में तालिका aliasing तो एसक्यूएल सर्वर बता सकते हैं द्वारा

UPDATE `your_table` t1, `your_table` t2 
SET t1.your_field = t2.your_field 
WHERE t1.other_field = some_condition 
AND t1.another_field = another_condition 
AND t2.source_id = 'explicit_value' 

प्रारंभ बंद उन्हें

अगला, कॉपी करने के लिए फ़ील्ड निर्दिष्ट करें।

अंतिम, पंक्तियों

की स्थिति आप एक श्रृंखला के लिए एक ही पंक्ति से कॉपी कर सकते हैं पर निर्भर करता है के चयन को नियंत्रित करने की स्थिति निर्दिष्ट करते हैं, या आप एक श्रृंखला के लिए एक श्रृंखला कॉपी कर सकते हैं। आप विभिन्न तालिकाओं को भी निर्दिष्ट कर सकते हैं, और आप संबंधों को नियंत्रित करने के लिए अन्य तालिकाओं का उपयोग करने की अनुमति देने के लिए उप-चयन या जुड़ सकते हैं।

+3

धन्यवाद देता है, स्वीकार्य उत्तर से बहुत स्पष्ट है :) – Metal450

+3

यह माइक्रोसॉफ्ट एसक्यूएल सर्वर में काम नहीं करता है। त्रुटि संदेश: 'टी 1' के पास गलत वाक्यविन्यास। – palota

+0

मैं @ Metal450 से सहमत हूं - बहुत स्पष्ट। –

-1

यह पूरे रिकॉर्ड को कॉपी करने के लिए अच्छी तरह से काम करता है।

UPDATE your_table 
SET new_field = sourse_field 
+0

यह प्रतियां कॉलम हैं, पंक्तियों – yzorg

1

इस प्रयास करें:

UPDATE barang 
SET ID FROM(SELECT tblkatalog.tblkatalog_id FROM tblkatalog 
WHERE tblkatalog.tblkatalog_nomor = barang.NO_CAT) WHERE barang.NO_CAT <>''; 
-2
UPDATE MyTable 
SET 
    complete = 1, 
    complete_date = newdata.complete_date, 
    post_score = newdata.post_score 
FROM 
    (
    SELECT 
     userID, 
     complete_date, 
     post_score 
    FROM MyTable 
    WHERE 
     courseID = 6 
     AND complete = 1 
     AND complete_date > '8/1/2008' 
    ) 
+0

कृपया कुछ स्पष्टीकरण प्रदान करें और उचित रूप से स्वरूपण करने के लिए अपनी पोस्ट को संपादित करें – Pooya

+0

"newdata" कहां घोषित किया गया है? – Petar

संबंधित मुद्दे