帮我解决这个问题:'为表中的所有行做这个'

时间:2009-07-13 19:45:21

标签: sql sql-server sql-server-2005 tsql

[使用SQL Server 2005]

我有一个充满用户的表,我想通过在分配表中创建一个新条目以及在课程跟踪表中的新条目,将表中的每个用户(16,000+)分配给一个课程,这样他们的可以跟踪数据。问题是我不知道如何在SQL中进行循环,因为我认为你不能这样做但是必须有办法做到这一点......

FOR TABLE中的每个用户 使用user TABLE ...

中的userID向两个表中的每一个表写一行

我该怎么做?请帮忙!

7 个答案:

答案 0 :(得分:13)

您可以使用2个插入语句执行此操作。您希望使用transaction来包装它以确保一致性,并且可能需要仔细检查我们的isolation level以确保在两个查询之间从users表中获得一致的读取(取看看SNAPSHOT或SERIALIZABLE以避免幻像读取。)

BEGIN TRAN

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

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

COMMIT TRAN   

答案 1 :(得分:6)

类似的东西:

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

答案 2 :(得分:1)

类似这样的东西,不需要循环,如果你有重复使用distinct 也用课程值改变1

insert into AssingmentTable
select userid,1
from UserTable

insert into OtherTable
select userid,1
from UserTable

答案 3 :(得分:0)

也许我误解了你的问题,但我认为你需要INSERT..SELECT声明

INSERT INTO TABLE2
SELECT filed1, field2 field3 from TABLE1

答案 4 :(得分:0)

SQL适用于集合。它不需要循环..

您正在寻找的可能是“插入”命令。

INSERT INTO <new_table> (<list of fields, comma separated>)
SELECT <list of fields,comma separated>
FROM <usertable>
WHERE <selection condition if needed>

答案 5 :(得分: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;

答案 6 :(得分:0)

我会使用很多其他人已经发布的基于集合的方法来做到这一点......

...但是,为了完整性,值得注意的是,如果你真的想要,你可以做一个循环。查看游标和在线书籍中的循环以查看一些示例。

请不要像许多新手那样陷入使用游标的陷阱。它们有它们的用途,但是如果它们被错误地使用它们会很糟糕 - 几乎总是有更好的做事方式。