Вставка нескольких строк в таблицу на основе количества строк в другой

#sql #sql-server #sql-insert

#sql #sql-сервер #sql-вставка

Вопрос:

Я пытаюсь вставить строки в таблицу Attendance_Check на основе количества учащихся в соответствующем классе. Для каждого учащегося в классе у них должна быть строка в таблице attendance_check .

Соответствующие таблицы включают: Attendance_Record, Att_Check, Student и Class

 declare @i int;

/* 1. Create a new Record for specified class and date*/

INSERT INTO Attendance_Record (Class_ID, Att_Date)
VALUES('1', GETDATE()); /* insert class_ID for the class the teacher is recording attendance for)*/

SELECT @i= SCOPE_IDENTITY();

INSERT INTO Att_Check (Att_ID, Stu_ID)
VALUES((SELECT @i), (SELECT S.Stu_ID
        FROM Student S
            INNER JOIN Class C
                ON S.Class_ID=C.Class_ID
        WHERE C.Class_ID='1'))
  

Этот код пытается заполнить таблицы attendance_check идентификатором посещаемости, который соответствует классу 1, и учащимися, принадлежащими к классу 1.

В настоящее время это выдает ошибку только о том, что подзапрос вернул более одного значения. Я понимаю, почему это так, но мне трудно думать о том, как переписать код, чтобы обойти это. Я бы хотел, чтобы результаты были такими:

 Attendance Record Table
Att_ID | Class_ID | Date
1          1         10/10/2019


Attendance Check Table
Att_ID| Stu_ID | Stu_Status
1        1
1        2   
1        3

  

Ответ №1:

Вставка из запроса с VALUES предложением в большинстве случаев не рекомендуется. INSERT ... SELECT Вместо этого используйте и .

 INSERT INTO att_check
           (att_id,
            stu_id)
           SELECT @i,
                  s.stu_id
           FROM student s
                INNER JOIN class c
                           ON s.class_id = c.class_id
           WHERE c.class_id = 1;
  

Также нет необходимости заключать числовые литералы в одинарные кавычки.