2012-04-13 17 views
2

我使用SQL Server 2008和我有4个表StudentAbsentees, Students, StudentSectionsSectionsSQL内两个表

StudentAbsentees表我存储studentId是不存在的某一天像(仅缺席),

之间的连接
StudentId  Time  Date   
    ----------- ------ ------ 
     1   10:00 2012-04-13 

并在StudentSections我在一个特定的部分存储所述studentId

StudentId SectionId 
    ---------- ------------ 
     1    1 
     2    1 
     3    1 

Students表中我存储学生详细信息,同样在Sections表中,我具有该部分的名称和容量等部分详细信息。

我需要加入这些表并显示该学生是否存在/不存在的某一天......结果应该是

StudentId Status 
--------- ------ 
    1   Absent 
    2   Present 
    3   Present 

我可以从这些表的缺席名单,我不知道怎么样以显示它们是否存在/不存在....谁能帮我在这里

回答

3
select * from (
    select s.id, 
      case 
       when sa.date = '2012-01-01' 
       then 'absent' 
       else 'present' 
      end as status, 
      ROW_NUMBER() OVER (PARTITION BY s.id ORDER BY CASE WHEN sa.date = '2012-01-01' THEN 1 ELSE 2 END) AS RowNumber 
    from students s 
    left outer join studentabsentees sa on s.id = sa.studentid 
) 
as a where a.RowNumber = 1 
+0

其显示错误,如'是'附近的无效语法,如果我删除sa。[日期]它的工作,但输出是错误的 – shanish 2012-04-13 18:48:41

+1

@Shanish:请尝试我编辑的答案。 – 2012-04-13 19:01:47

+0

感谢您的回复juergen,其显示所有的状态为“缺席” – shanish 2012-04-13 19:06:20

1

你查询显示所有学生的状态某一天会是什么样子:

select s.id, s.name, a.status 
from student s 
left join studentabsentees a on s.id = a.studentid 
where a.date = ? 

Ø显然你必须提供一个日期。

注意:您的问题在标题中使用“内部连接”。我认为左边是更合适的,因为它会显示给所有学生。但是如果你真的只想要那些在缺席表中有记录的人,那么你可以将查询中的“左”改为“内”。

注2:我的查询假定状态字段。如果你没有,那么看看juergen的答案。

+0

感谢蒂姆我会检查它,让你知道 – shanish 2012-04-13 14:45:55

+0

我误解了这个问题,并没有看到该状态不在学生支持表中,你应该看看@juergen的答案如何处理呈现状态基于空数据 – 2012-04-13 14:50:05

1

无需连接,你可以使用集合运算符:

SELECT StudentID, 'Absent' 
FROM StudentsAbsentees 
WHERE [date] = ... 
UNION 
(
SELECT StudentID, 'Present' 
FROM Students 
EXCEPT 
SELECT StudentID, 'Present' 
FROM StudentsAbsentees 
WHERE [date] = ... 
) 

可以显示“存在”,并通过只是选择他们作为常数“缺席”。很容易得到所有缺席学生的名单。然后把这与所有在场的学生结合起来。通过完整的学生名单和使用失踪学生的除外操作员来找到现在的学生。但是除了这部分之外,请确保您选择缺席的学生作为在场,所以他们会从您刚刚创建的名字旁边的所有学生列表中很好地减去。