我试图根据相关班级的学生人数,将行插入到Attendance_Check表中。对于班上的每个学生,他们的出勤检查表中应有一行。
相关表格包括:出勤记录,Att_Check,学生和班级
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'))
此代码尝试使用与班级1相关的出勤ID和属于班级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
答案 0 :(得分:0)
在大多数情况下,不建议从带有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;
也不需要将数字文字括在单引号中。