如何检查所有教师学生是否符合要求

时间:2015-12-14 20:47:38

标签: sql sql-server

我必须为每位老师做以下事。

鉴于TeacherId,我想选择所有拥有该教师并且已通过第一学期的学生。 如果所有教师都已通过,我想调用另一个存储过程:

EXEC AllTeachersStudentsPassedSemester1 @teacherId

表格如下:

教师      - teacherId

Students
 -userId
 -teacherId

CourseSummarry
 -userId
 -passedSemester1 (bool)

为了让所有用户都能得到给定的老师:

SELECT userId
FROM Students
WHERE teacherId = @teacherId

如何测试该列表中的所有学生是否已通过Semester1 = TRUE,然后为该教师调用该proc AllTeachersStudentsPassedSemester1。很困惑我如何检查所有学生是否已经过去了。

然后我必须以某种方式遍历所有老师才能做到这一点。

这似乎我必须用代码而不是sql来编程。

6 个答案:

答案 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;