نسخ البيانات من القائمة صف إلى آخر الصف الحالي في SQL ؟

StackOverflow https://stackoverflow.com/questions/663154

  •  20-08-2019
  •  | 
  •  

سؤال

لدي جدول كامل من تتبع بيانات محددة الحال ، الدورة رقم 6.

الآن لدي إضافة جديدة تتبع بيانات الدورة رقم 11.

كل صف من البيانات لمستخدم واحد لمدة دورة واحدة ، حتى بالنسبة للمستخدمين تعيين كل دورة 6 و 11 الحال هناك صفين من البيانات.

يريد العميل جميع المستخدمين الذين أكملوا الدورة رقم 6 أي وقت بعد 1 أغسطس 2008 أن يكون أيضا إنجاز ملحوظ عن الدورة 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)

بعض القيم سوف تكون فارغة و userID/courseID من الواضح أنه لن يتم ترحيلها كما هو بالفعل في المكان الصحيح.

هل كانت مفيدة؟

المحلول

وربما قرأت المشكلة مخطئا، ولكن أعتقد أنك بالفعل أدخلت دورة 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

انظر هذه المسألة المتعلقة SO لمزيد من المعلومات

نصائح أخرى

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

ولقد ينظر دائما من بند من التحديث، وكأنه واحد من اختيار وضعها الطبيعي. في الواقع إذا كنت تريد أن تحقق ما سيتم تحديث قبل تشغيل التحديث، يمكنك أن تأخذ استبدال الأجزاء التحديث مع C11 حدد. *. انظر تعليقاتي على إجابة للبطة العرجاء و.

نسخ القيمة من صف واحد إلى أي مؤهل آخر الصفوف داخل نفس الجدول (أو جداول مختلفة):

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'

تبدأ من خلال التعرج الجدول في 2 فريدة من نوعها المراجع حتى SQL server يمكن التفريق بينهم

بجانب تحديد مجال(s) نسخ.

الماضي, تحديد الشروط التي تحكم عملية اختيار الصفوف

اعتمادا على ظروف قد نسخ من صف واحد إلى سلسلة ، أو قد نسخ سلسلة إلى سلسلة.كما يمكنك تحديد جداول مختلفة و يمكنك حتى استخدام الفرعية يختار أو ينضم إلى السماح باستخدام الجداول الأخرى للسيطرة على العلاقات.

استخدام SELECT إلى إدراج سجلات

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'

وجرب هذا:

UPDATE barang
SET ID FROM(SELECT tblkatalog.tblkatalog_id FROM tblkatalog 
WHERE tblkatalog.tblkatalog_nomor = barang.NO_CAT) WHERE barang.NO_CAT <>'';

وهذا يعمل بشكل جيد للتعامل سجلات بأكملها.

UPDATE your_table
SET new_field = sourse_field
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top