[英]How to check if all of a Teachers students have met a requirement
我必须为每位老师做以下事情。
给定一个TeacherId,我想选择所有拥有该老师并已通过第一学期的学生。 如果所有老师都通过了考试,我想调用另一个存储过程:
EXEC AllTeachersStudentsPassedSemester1 @teacherId
下表如下:
老师-TeacherId
Students
-userId
-teacherId
CourseSummarry
-userId
-passedSemester1 (bool)
因此,要获得给定老师的所有用户,我需要:
SELECT userId
FROM Students
WHERE teacherId = @teacherId
如何测试列表中的所有学生是否都通过了Semester1 = TRUE,然后为该老师调用了proc AllTeachersStudentsPassedSemester1
。 困惑如何检查所有学生是否都通过了考试。
然后,我必须以某种方式遍历所有老师才能做到这一点。
似乎我必须用代码而不是sql对此进行编程。
如果我没有理解你的问题,你可以使用join
具有聚合得到教师的名单。 然后,您将需要使用cursor
调用传入每个教师ID的单独存储过程。 这是获取教师的sql
:
select s.teacherid
from students s
join coursesummary cs on s.userid = cs.userid
group by s.teacherid
having count(*) = sum(case when cs.passedSemester1 = 'true' then 1 else 0 end)
假定每个student
记录都存在于coursesummary
。 如果不是的话,你需要使用一个outer join
,改变having
标准略有下降。
附带说明一下,您的桌子设计似乎有些不对劲。 我认为您需要一个课程表和一个不同的交叉引用查找表。 我不会假定您会理解您的数据库。
此查询应为您提供所有没有失败学生的老师:
Select Distinct S.TeacherId
From Students S
Where Not Exists
(
Select *
From CourseSummary C
Where C.UserId In
(
Select S2.UserId
From Students S2
Where S2.TeacherId = S.TeacherId
)
And C.passedSemester1 = 0
)
然后,您可以在CURSOR
使用它来遍历每个条目以执行该过程:
Declare @TeacherId Int
Declare cur Cursor For
Select Distinct S.TeacherId
From Students S
Where Not Exists
(
Select *
From CourseSummary C
Where C.UserId In
(
Select S2.UserId
From Students S2
Where S2.TeacherId = S.TeacherId
)
And C.passedSemester1 = 0
)
Open cur
While (1 = 1)
Begin
Fetch Next From cur Into @TeacherId
If @@Fetch_Status <> 0 Break
Execute AllTeachersStudentsPassedSemester1 @TeacherId
End
Close cur
Deallocate cur
这是您的查询,用于获取与给定老师一起通过了学期的所有学生:
SELECT S.userId
FROM Students S, CourseSummarry CS
WHERE CS.passedSemester1 = true
AND CS.userId = S.userId
AND S.teacherId = @teacherId
我通过“ ...检查所有学生是否都通过”来解决您的问题,而不是为您的问题提供完整的解决方案。
当选择学生时,请使用以下SQL(语法上不正确,但您会明白的):
select userId
from Students join Teacher
on Students.teacherId = Teacher.teacherId
and teacherId = @teacherId
join CourseSummary
on Students.userId = CourseSummary.userid
and CourseSummary.passedSemester1 = true;
高温超导
SELECT teacherId
FROM Students
JOIN CourseSummarry
on CourseSummarry.userId = Students.userId
and passedSemester1 = 'true'
except
SELECT teacherId
FROM Students
JOIN CourseSummarry
on CourseSummarry.userId = Students.userId
and passedSemester1 = 'false'
与其检查是否所有学生都合格,不如检查是否所有学生都没有失败:检查所有学生是否都通过了,您需要知道有多少学生和多少通过了,检查是否没有一个学生只需要知道有多少失败了。
Select failed = Sum(Cast(passedSemester1 AS Int))
From CourseSummarry cs
INNER JOIN Students st ON cs.userId = st.userId
WHERE @teacherId
由于SUM
不能用于布尔值,因此您首先需要将其转换为另一种类型,在这种情况下为整数。
现在,如果failed为0,我们需要执行其他存储过程,为此,我们可以将failed
转换为变量,并使用if
检查它
Declare @failed int
Select @failed = Sum(Cast(passedSemester1 AS Int))
From CourseSummarry cs
INNER JOIN Students st ON cs.userId = st.userId
WHERE @teacherId
If @failed = 0 Then
EXEC AllTeachersStudentsPassedSemester1 @teacherId
End If
最后一步是将所有内容封装在存储过程定义中
CREATE Procedure myProc @teacherId
AS
BEGIN
Declare @failed int
Select @failed = Sum(Cast(passedSemester1 AS Int))
From CourseSummarry cs
INNER JOIN Students st ON cs.userId = st.userId
WHERE @teacherId
If @failed = 0 Then
EXEC AllTeachersStudentsPassedSemester1 @teacherId
End If
END;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.