#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;
Также нет необходимости заключать числовые литералы в одинарные кавычки.