Помогите мне с этим SQL: «СДЕЛАЙ ЭТО ДЛЯ ВСЕХ РЯДОВ В ТАБЛИЦЕ» - PullRequest
4 голосов
/ 13 июля 2009

[с использованием SQL Server 2005]

У меня есть таблица, заполненная пользователями, я хочу назначить каждому пользователю в таблице (более 16 000) для курса, создав новую запись в таблице назначений, а также новую запись в таблице отслеживания курса, чтобы их данные могут быть отслежены. Проблема в том, что я не знаю, как сделать цикл в SQL, потому что я не думаю, что вы можете, но должен быть способ сделать это ...

ДЛЯ КАЖДОГО пользователя в ТАБЛИЦЕ записать строку в каждую из двух таблиц с userID от пользователя TABLE ...

как бы я это сделал? пожалуйста, помогите!

Ответы [ 7 ]

13 голосов
/ 13 июля 2009

Вы сделали бы это с помощью двух операторов вставки. Вы хотите заключить это в транзакцию , чтобы обеспечить согласованность, и, возможно, захотите дважды проверить наш уровень изоляции , чтобы убедиться, что вы получаете согласованное чтение из таблицы пользователей между 2 запроса (посмотрите на SNAPSHOT или SERIALIZABLE, чтобы избежать фантомного чтения).

BEGIN TRAN

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

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

COMMIT TRAN   
6 голосов
/ 13 июля 2009

Что-то вроде:

insert into CourseAssignment (CourseId, StudentId)
select 1 -- whatever the course number is
   , StudendId
from Student
1 голос
/ 13 июля 2009

что-то вроде этого, нет необходимости в цикле, если у вас есть дупс использовать разные также измените 1 со значением курса

insert into AssingmentTable
select userid,1
from UserTable

insert into OtherTable
select userid,1
from UserTable
0 голосов
/ 14 июля 2009

Я бы сделал это, используя подходы, основанные на множестве, которые многие другие уже опубликовали ...

... однако, просто для полноты, стоит отметить, что вы могли бы сделать цикл, если бы вы действительно этого хотели. Посмотрите курсоры и циклы while в книгах в Интернете, чтобы увидеть некоторые примеры.

Только, пожалуйста, не попадитесь в ловушку использования курсоров, как это делают многие новички. У них есть свое применение, но если они используются неправильно, они могут быть ужасными - почти всегда есть лучший способ сделать что-либо.

0 голосов
/ 13 июля 2009
--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 голосов
/ 13 июля 2009

SQL работает на множествах. Не требует петель ..

то, что вы ищете, может быть командой "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 голосов
/ 13 июля 2009

возможно, я неправильно понимаю ваш вопрос, но я думаю, что вам нужно INSERT..SELECT заявление

INSERT INTO TABLE2
SELECT filed1, field2 field3 from TABLE1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...