Копировать данные из одной существующей строки в другую существующую строку в SQL?
У меня есть таблица, полная данных отслеживания для конкретного курса, Курс № 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, очевидно, не будут перенесены, поскольку они уже находятся в нужном месте.
7 ответов:
Возможно, я неправильно понял проблему, но я считаю, что вы уже вставили записи курса 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Я всегда рассматривал предложение From обновления, как одно из обычных select. На самом деле, если вы хотите проверить, что будет обновлено перед запуском обновления, вы можете взять заменить части обновления с выбором 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-сервер мог отличить их друг от друга
Далее укажите поля для копирования.
Наконец, укажите условия, регулирующие выбор строк
В зависимости от условий вы можете копировать из одной строки в серию или из серии в серию. Вы также можете указать различные таблицы, и вы даже можете использовать подзапросы или соединения, чтобы использовать другие таблицы для управления отношениями.
Используйте 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 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' )
Comments