我必须为每位老师做以下事。
鉴于TeacherId,我想选择所有拥有该教师并且已通过第一学期的学生。 如果所有教师都已通过,我想调用另一个存储过程:
EXEC AllTeachersStudentsPassedSemester1 @teacherId
表格如下:
教师 - teacherId
Students
-userId
-teacherId
CourseSummarry
-userId
-passedSemester1 (bool)
为了让所有用户都能得到给定的老师:
SELECT userId
FROM Students
WHERE teacherId = @teacherId
如何测试该列表中的所有学生是否已通过Semester1 = TRUE,然后为该教师调用该proc AllTeachersStudentsPassedSemester1
。很困惑我如何检查所有学生是否已经过去了。
然后我必须以某种方式遍历所有老师才能做到这一点。
这似乎我必须用代码而不是sql来编程。
答案 0 :(得分:1)
如果我正确理解您的问题,您可以使用带有聚合的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
条件。
作为旁注,表格设计似乎有些不对劲。我认为你需要一个courseid和一个不同的交叉引用查找表。我不会假设你理解你的数据库。
答案 1 :(得分:1)
此查询应该为您提供所有没有失败学生的教师:
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
答案 2 :(得分:0)
这是您的查询,以便让所有通过该学期的学生与给定的老师一起学习:
SELECT S.userId
FROM Students S, CourseSummarry CS
WHERE CS.passedSemester1 = true
AND CS.userId = S.userId
AND S.teacherId = @teacherId
答案 3 :(得分:0)
我提供此作为帮助解决您的问题&#34; ...检查所有学生是否已通过&#34;而不是你问题的完整解决方案。
当您选择学生时,请使用以下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;
HTH
答案 4 :(得分:0)
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'
答案 5 :(得分:0)
而不是检查所有学生是否已经过去更容易检查是否有学生失败:要检查所有学生是否已经通过,你需要知道有多少学生和有多少学生通过,检查是否有人失败你只需要知道有多少人失败了。
Select failed = Sum(Cast(passedSemester1 AS Int))
From CourseSummarry cs
INNER JOIN Students st ON cs.userId = st.userId
WHERE @teacherId
由于SUM
不能用于布尔值,首先需要将其转换为另一种类型,在本例中为整数。
现在如果失败为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;