2009-03-19 1 views
38

У меня есть таблица, полный отслеживания данных для специфических, курс номер 6.Скопировать данные из одной существующей строки в другую существующую строку в SQL?

Теперь я добавил новые данные отслеживания для курса номер 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) 

Некоторые значения будут NULL и идентификатор пользователя/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

любой шанс, который вы могли бы объяснить мне, как работает эта вещь newdata, которая выглядит как удобная вещь, но я не совсем уверен, что получаю ее – 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

хмм ОК, но я смогу сделать WHERE, который проверяет, как INSERT и ВЫБРАТЬ в том, что это в той же таблице? – BigOmega

+0

Должен быть в состоянии, дайте пример, я просто добавил попытку. –

+0

Вероятно, необходимо установить full_date на текущую дату, если это необходимо. Это должно заставить вас начать. –

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 

Я всегда просматривалась ЕКОМ обновления, как один из обычного выбора. На самом деле, если вы хотите проверить, что будет обновлено до запуска обновления, вы можете заменить части обновления на select c11. *. Смотрите мои комментарии на ответ хромой утки.

10

Скопируйте значение из одного ряда в любых других подходящих строк в пределах одной и той же таблицы (или разных таблиц):

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 может сказать их разделить

Далее укажите поле (и) для копирования.

Последнее, оговорить условия, определяющие выбор строк

В зависимости от условий, вы можете скопировать из одного ряда в ряд, или вы можете скопировать серии к серии. Вы также можете указать разные таблицы, и вы даже можете использовать подвыборки или объединения, чтобы разрешить использование других таблиц для управления отношениями.

+3

Спасибо, гораздо яснее, чем принятый ответ :) – Metal450

+3

Он не работает в Microsoft SQL Server. Сообщение об ошибке: неправильный синтаксис рядом с 't1'. – 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

Смежные вопросы