Скопировать данные из одной существующей строки в другую существующую строку в SQL? - PullRequest
40 голосов
/ 19 марта 2009

У меня есть таблица с данными отслеживания для конкретного курса, курс № 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, очевидно, не будут перенесены, поскольку они уже находятся в нужном месте.

Ответы [ 6 ]

65 голосов
/ 19 марта 2009

Возможно, я неправильно прочитал проблему, но я считаю, что вы уже вставили записи курса 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 для получения дополнительной информации

11 голосов
/ 21 января 2010

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

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-сервер мог их различать

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

Наконец, укажите условия, определяющие выбор строк

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

11 голосов
/ 19 марта 2009
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. *. Смотрите мои комментарии к ответу хромой утки.

6 голосов
/ 19 марта 2009

Используйте 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'
2 голосов
/ 19 сентября 2014

Попробуйте это:

UPDATE barang
SET ID FROM(SELECT tblkatalog.tblkatalog_id FROM tblkatalog 
WHERE tblkatalog.tblkatalog_nomor = barang.NO_CAT) WHERE barang.NO_CAT <>'';
0 голосов
/ 09 декабря 2011

Это хорошо работает для копирования целых записей.

UPDATE your_table
SET new_field = sourse_field
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...