2009-03-05 20 views
24

OK Tengo una tabla que tiene dos columnas, ID de usuario e ID de curso. Se usa para asignar cursos de capacitación a un usuario. Se ve así:¿Duplicar una fila en SQL?

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

0 para que el usuario se asigna a los cursos 1,3,6 y el usuario 1 se asigna a 1, 4 5

de todos modos tengo que tomar cada usuario que se asigna a 6 y crear una nueva fila que tenga ese ID de usuario y curso 11, básicamente asignando a cada usuario que está asignado actualmente a 6 para que también se asigne a 11

por alguna razón (no creé esta base de datos) ambas filas están marcadas como primarias claves, y algunas declaraciones que he intentado han arrojado un error debido a esto, ¿qué diablos es el trato?

tal vez sea porque hay unos pocos usuarios que ya están asignados a 11, por lo que se está ahogando en los que tal vez?

favor ayuda

Respuesta

44
Insert Into TableName (userID, courseID) 
    Select userID, 11 From TableName Where courseID=6; 

Además, estoy un poco confundido por su comentario de que ambos son claves primarias. Ambas filas pueden ser parte de la clave principal o ambas pueden ser claves únicas pero no pueden ser ambas claves primarias. En lo que respecta a los errores, es probable que se deba a que la consulta intentó insertar filas que eran duplicados de filas ya existentes. Para eliminar esta posibilidad que podría hacer esto:

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

Dependiendo de su base de datos esto podría funcionar también:

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

De todos modos, hay que ir.

+1

GS - que es una construcción interesante - donde ¿Funciona? No funciona en SQL Server 2005 ... –

-2

Esto debería ayudar:

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

Esto seleccionará todos los usuarios en el curso de 6 no en curso de 11 y añadirlos con el curso de 11 a la mesa.

+0

Ummm ... esto no funcionará. Un registro con un ID de curso de 6 no tendrá, por definición, un ID de curso de 11. Necesita una subcompetencia como la que muestro en mi respuesta. –

+0

Sí, me di cuenta de eso tan pronto como lo publiqué y lo reescribí. Pero luego fui derrotado al golpe. – achinda99

+0

Ok, me quitaré mi voto negativo. Simplemente no quería confundir a Ryan, así que sentí que tenía que rechazarlo. Pero, de verdad, * odio * bajar las respuestas en un hilo al que le he dado una respuesta. Por lo tanto, estoy feliz de quitárselo! –

2
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 
      ) 

Selecciona todos los usuarios que están asignados a courseid 6, pero aún no son asignados a courseid 11 e inserta un nuevo registro en la tabla para ellos para courseid 11.

Cuestiones relacionadas