2009-03-05 12 views
24

OK J'ai une table qui a deux colonnes, ID utilisateur et ID course. Il est utilisé pour attribuer des cours de formation à un utilisateur. Il ressemble à ceci:Dupliquer une ligne dans SQL?

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

si l'utilisateur 0 est affecté à des cours 1,3,6 et l'utilisateur 1 est affecté à 1, 4 5

de toute façon que je dois prendre chaque utilisateur qui est attribué à 6 et créer une nouvelle ligne qui a cet ID utilisateur et coursid 11, assignant fondamentalement chaque utilisateur qui est actuellement affecté à 6 à être également affecté à 11

pour une raison quelconque (je n'ai pas créé cette base de données) les deux lignes sont marquées comme primaires clés, et certaines déclarations que j'ai essayé ont jeté une erreur à cause de cela, que diable est l'affaire?

oh c'est peut-être parce qu'il y a quelques utilisateurs qui sont déjà assignés à 11 donc c'est étouffant sur ceux-ci peut-être?

s'il vous plaît aider

Répondre

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

, je suis aussi un peu confus par votre commentaire que les deux sont des clés primaires. Les deux lignes peuvent être partie de la clé primaire ou les deux peuvent être des clés uniques, mais elles ne peuvent pas toutes deux être une clé primaire. En ce qui concerne les erreurs, c'est probablement parce que la requête a tenté d'insérer des lignes qui étaient des doublons de lignes déjà existantes. Pour éliminer cette possibilité, vous pouvez le faire:

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

En fonction de votre base de données que cela pourrait fonctionner aussi:

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

Quoi qu'il en soit, là vous allez.

+1

GS - c'est une construction intéressante - où est-ce que ça marche? Cela ne fonctionne pas dans SQL Server 2005 ... –

-2

Cela devrait aider:

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

Cela permet de sélectionner tous les utilisateurs dans le cours 6 pas 11 cours et les ajouter avec bien sûr 11 à la table.

+0

Ummm .... cela ne fonctionnera pas. Un enregistrement avec un ID de parcours de 6 n'aura pas, par définition, un ID de cours de 11. Vous devez avoir une sous-requête comme je l'ai indiqué dans ma réponse. –

+0

Oui, je me suis rendu compte que dès que je l'ai posté et réécrit. Mais ensuite j'ai été battu au coup de poing. – achinda99

+0

Ok - Je retire mon downvote alors. Je ne voulais juste pas confondre Ryan, alors je me sentais comme si je devais l'abandonner. Mais, vraiment, je * déteste * downvoting réponses sur un thread que j'ai fourni une réponse à. Donc, je suis heureux de l'enlever! –

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 
      ) 

Sélectionne tous les utilisateurs qui sont affectés à courseid 6 mais ne sont pas encore affectés à courseid 11 et insère un nouveau record dans la table pour eux pour courseid 11.

Questions connexes