Скопировать данные из одной существующей строки в другую существующую строку в 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)
Некоторые значения будут NULL, а userID/courseID, очевидно, не будут перенесены, поскольку они уже находятся в нужном месте.
Ответы
Ответ 1
Возможно, я неправильно прочитал эту проблему, но я считаю, что вы уже ввели записи курса 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 для получения дополнительной информации
Ответ 2
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. *. Посмотрите мои комментарии на ответ хромой утки.
Ответ 3
Скопировать значение из одной строки в любые другие квалифицированные строки в пределах одной таблицы (или разных таблиц):
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'
Начните с сглаживания таблицы на две уникальные ссылки, чтобы сервер SQL мог отличать их
Далее укажите поле (и) для копирования.
Наконец, укажите условия, определяющие выбор строк
В зависимости от условий, которые вы можете копировать из одной строки в серию, или вы можете скопировать серию в серию. Вы также можете указать разные таблицы, и вы даже можете использовать подвыборки или объединения, чтобы разрешить использование других таблиц для управления отношениями.
Ответ 4
Используйте 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'
Ответ 5
Попробуйте следующее:
UPDATE barang
SET ID FROM(SELECT tblkatalog.tblkatalog_id FROM tblkatalog
WHERE tblkatalog.tblkatalog_nomor = barang.NO_CAT) WHERE barang.NO_CAT <>'';
Ответ 6
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
сделал работу
благодарю вас
Ответ 7
Это хорошо работает для копирования целых записей.
UPDATE your_table
SET new_field = sourse_field
Ответ 8
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'
)