Дублировать строку в SQL? - PullRequest
32 голосов
/ 05 марта 2009

ОК. У меня есть таблица с двумя столбцами: userID и courseID. Он используется для назначения учебных курсов пользователю. Это выглядит так:

userid   courseid
0          1
0          3
0          6
1          1
1          4
1          5

, поэтому пользователь 0 назначен на курсы 1,3,6, а пользователь 1 назначен на 1, 4 5

В любом случае мне нужно взять каждого пользователя, которому назначено 6, и создать новую строку с этим идентификатором пользователя и курсом 11, в основном назначая каждому пользователю, которому в настоящее время назначено 6, также назначаться 11

по какой-то причине (я не создавал эту базу данных) обе строки помечены как первичные ключи, и некоторые операторы, которые я пробовал, выдавали ошибку из-за этого, какого черта дело?

О, может быть, это потому, что есть несколько пользователей, которые уже назначены на 11, так что, возможно, он задыхается от них?

пожалуйста, помогите

Ответы [ 3 ]

53 голосов
/ 05 марта 2009
Insert Into TableName (userID, courseID)
  Select userID, 11 From TableName Where courseID=6;

Кроме того, меня немного смущает ваш комментарий о том, что оба являются первичными ключами. Обе строки могут быть часть первичного ключа или обе могут быть уникальными ключами, но они не могут быть первичными ключами. Что касается ошибок, возможно, это связано с тем, что запрос пытался вставить строки, которые были дубликатами уже существующих строк. Чтобы исключить эту возможность, вы можете сделать это:

Insert Into TableName (userID, courseID)
  Select userID, 11 From TableName Where courseID=6 
     AND (userID not in (Select userID From TableName Where courseID=11))

В зависимости от вашей базы данных это тоже может работать:

INSERT OR IGNORE INTO TableName (userID, courseID)
    SELECT userID, 11 FROM TableName WHERE courseID=6;

Во всяком случае, вы идете.

2 голосов
/ 05 марта 2009
insert into TableName (userId, courseId)
    select userId, 11
    from   TableName
    where  courseId = 6
    and    not exists (
               select 1
               from   TableName nested
               where  nested.userId = TableName.UserId
               and    nested.courseId = 11
           )

Выбирает всех пользователей, которые назначены для CourseId 6, но еще не назначены для CourseId 11, и вставляет новую запись в таблицу для них для CourseId 11.

0 голосов
/ 05 марта 2009

Это должно помочь:

INSERT
INTO   [table]
       (
              userid,
              courseid
       )
SELECT userid,
       11
FROM   [table]
WHERE  courseid    = 6
   AND userid NOT IN
                     (SELECT userid
                     FROM    [table]
                     WHERE   courseid = 11
                     );

Это выберет всех пользователей в курсе 6, а не в курсе 11, и добавит их с курсом 11 в таблицу.

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