2009-03-19 39 views
38

Tôi có một bảng đầy đủ các dữ liệu theo dõi cho khóa học càng cụ thể, dĩ nhiên số 6.Sao chép dữ liệu từ một hàng hiện có sang hàng hiện có khác trong SQL?

Bây giờ tôi đã thêm dữ liệu theo dõi mới cho khóa học số 11.

Mỗi hàng dữ liệu là dành cho một người sử dụng cho một khóa học , do đó, đối với người dùng được chỉ định cho cả khóa học 6 và khóa học 11, có hai hàng dữ liệu.

Khách hàng muốn tất cả người dùng đã hoàn thành khóa học số 6 bất kỳ lúc nào sau ngày 1 tháng 8 năm 2008 cũng đã hoàn tất được đánh dấu là khóa học 11. Tuy nhiên tôi không thể chuyển đổi từ 6 đến 11 vì họ muốn giữ lại dữ liệu cũ của họ Vì vậy, đối với mỗi hàng có số khóa học là 6, được đánh dấu là hoàn thành và lớn hơn ngày 1 tháng 8 năm 2008, tôi muốn ghi dữ liệu hoàn thành qua hàng có chứa theo dõi cho khóa học 11 cho người dùng cụ thể đó.

Tôi sẽ cần phải chuyển dữ liệu từ hàng khóa học 6 sang hàng khóa học 11 để những thứ như điểm số của người dùng và ngày đăng hoàn thành được chuyển sang.

Dưới đây là cấu trúc của bảng:

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) 

Một số giá trị này sẽ được NULL và userID/courseID rõ ràng sẽ không được tiến hành trên vì đó là đã ở đúng nơi.

Trả lời

60

Có lẽ tôi đọc các vấn đề sai, nhưng tôi tin rằng bạn đã có lắp khóa học 11 hồ sơ và đơn giản chỉ cần cập nhật những đáp ứng các tiêu chí mà bạn liệt kê với dữ liệu trình 6 của.

Nếu đây là trường hợp, bạn sẽ muốn sử dụng một tuyên bố 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

bất kỳ cơ hội nào bạn có thể giải thích cho tôi về cách thức hoạt động của newdata, trông giống như một thứ tiện dụng nhưng tôi không chắc chắn rằng tôi nhận được nó – BigOmega

+0

điều này có hiệu quả, cảm ơn! – BigOmega

+0

@Ryan bạn đã chạy/xác minh nó chưa? – 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

hmm OK, nhưng tôi sẽ có thể làm một WHERE để kiểm tra cả INSERT và SELECT được rằng điều này là trong cùng một bảng? – BigOmega

+0

Nếu có thể, hãy đưa ra ví dụ tôi vừa thêm một lần thử. –

+0

Có lẽ nên đặt ngày hoàn thành cho ngày hiện tại, nếu đó là yêu cầu. Điều đó sẽ giúp bạn bắt đầu, mặc dù. –

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 

Tôi luôn xem mệnh đề FROM của một bản cập nhật, giống như một trong những lựa chọn bình thường. Trên thực tế, nếu bạn muốn kiểm tra những gì sẽ được cập nhật trước khi chạy bản cập nhật, bạn có thể thay thế các phần cập nhật bằng một lựa chọn c11. *. Xem bình luận của tôi về câu trả lời của con vịt què.

10

Sao chép một giá trị từ một dòng cho bất kỳ hàng khác có trình độ trong cùng một bảng (hoặc các bảng khác nhau):

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' 

Bắt đầu tắt bởi aliasing bảng vào 2 tài liệu tham khảo duy nhất để máy chủ SQL có thể nói chúng cách nhau

Tiếp theo, chỉ định (các) trường cần sao chép.

ngoái, cụ thể điều kiện chi phối việc lựa chọn các hàng

Tùy thuộc vào điều kiện bạn có thể sao chép từ một hàng duy nhất một bộ sách, hoặc bạn có thể sao chép một loạt đến một loạt. Bạn cũng có thể chỉ định các bảng khác nhau và thậm chí bạn có thể sử dụng các lựa chọn con hoặc tham gia để cho phép sử dụng các bảng khác để kiểm soát các mối quan hệ.

+3

Cảm ơn, rõ ràng hơn câu trả lời được chấp nhận :) – Metal450

+3

Nó không hoạt động trong Microsoft SQL Server. Thông báo lỗi: Cú pháp không chính xác gần 't1'. – palota

+0

Tôi đồng ý với @ Metal450 - rõ ràng hơn nhiều. –

-1

Tính năng này hoạt động tốt để đối phó toàn bộ bản ghi.

UPDATE your_table 
SET new_field = sourse_field 
+0

bản sao này cột, không phải hàng – yzorg

1

Hãy thử điều này:

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

vui lòng cung cấp một số giải thích và cũng có thể chỉnh sửa bài đăng của bạn để có định dạng đúng – Pooya

+0

trong đó "newdata" được khai báo ở đâu? – Petar

Các vấn đề liên quan