2009-07-13 7 views
4

[en utilisant SQL Server 2005]Aidez-moi avec ce SQL: 'le faire pour toutes les lignes TABLE

J'ai une table complète des utilisateurs, je veux attribuer à chaque utilisateur unique dans la table (16,000+) à un cours en créant une nouvelle entrée dans la table d'affectation ainsi qu'une nouvelle entrée dans la table de suivi des cours afin que leurs données puissent être suivies. Le problème est que je ne sais pas comment faire une boucle en SQL parce que je ne pense pas que vous pouvez, mais il doit y avoir un moyen de le faire ...

POUR CHAQUE utilisateur dans le TABLEAU écrire une rangée à chacune des deux tables avec userID de user TABLE ...

Comment est-ce que je ferais ceci? aidez s'il vous plaît!

+0

MERCI À TOUS !!! – BigOmega

Répondre

6

Quelque chose comme:

insert into CourseAssignment (CourseId, StudentId) 
select 1 -- whatever the course number is 
    , StudendId 
from Student 
1

quelque chose comme ça, pas besoin d'une boucle, si vous avez dups utiliser distinct changer aussi 1 avec la valeur du cours

insert into AssingmentTable 
select userid,1 
from UserTable 

insert into OtherTable 
select userid,1 
from UserTable 
13

Tu ferais cela avec 2 instructions d'insertion. Vous voudriez envelopper ceci avec un transaction pour assurer la cohérence, et pouvez vouloir vérifier notre isolation level pour s'assurer que vous obtenez une lecture consistante de la table d'utilisateurs entre les 2 questions (jetez un oeil à SNAPSHOT ou SERIALIZABLE pour éviter lectures fantômes).

BEGIN TRAN 

INSERT Courses 
     (UserID, CourseNumber, ...) 
SELECT UserID, 'YourCourseNumberHere', ... 
FROM Users 

INSERT Assignments 
     (UserID, AssignmentNumber, ...) 
SELECT UserID, 'YourAssignmentNumberHere', ... 
FROM Users 

COMMIT TRAN 
+2

+1 pour cette réponse, car il s'agit d'une transaction entourant les deux instructions, ce qui correspond le plus probablement à l'intention de la question. –

0

peut-être je misuderstand votre question, mais je pense que vous avez besoin déclaration INSERT..SELECT

INSERT INTO TABLE2 
SELECT filed1, field2 field3 from TABLE1 
0

SQL fonctionne sur des ensembles. Il ne nécessite pas de boucles ..

Ce que vous recherchez peut être la commande "insert into".

INSERT INTO <new_table> (<list of fields, comma separated>) 
SELECT <list of fields,comma separated> 
FROM <usertable> 
WHERE <selection condition if needed> 
0
--grab 1 record for each student, and push it into the courses table 
--i am using a sub-select to look up a course id based on a name 
--that may not work for your situation, but then again, it may... 
INSERT INTO COURSES(
    COURSE_ID 
,STUDENT_ID 
) 
SELECT 
    (SELECT COURSE_ID FROM COURSES WHERE COURSE_NAME = 'MATH') 
,STUDENT_ID 
FROM 
    STUDENTS; 

--grab your recently entered course data and create an entry in 
--your log table too 
INSERT INTO COURSE_DATA(
    COURSE_ID 
,STUDENT_ID 
) 
SELECT 
    COURSE_ID 
,STUDENT_ID 
FROM 
    COURSES; 
0

Je le faire en utilisant les approches basées sur ensemble que beaucoup d'autres ont déjà posté ...

... Mais, juste pour être complet, il convient de noter que vous pouvez faire boucle si tu le voulais vraiment. Rechercher des curseurs et des boucles dans les livres en ligne pour voir quelques exemples.

Juste s'il vous plaît ne tombez pas dans le piège de l'utilisation de curseurs comme beaucoup de débutants font. Ils ont leurs usages mais s'ils sont mal utilisés, ils peuvent être terribles - il y a presque toujours une meilleure façon de faire les choses.

Questions connexes