两个表之间的SQL内连接

时间:2012-04-13 14:39:57

标签: sql-server-2008 inner-join

我正在使用SQL Server 2008,我有4个表StudentAbsentees, Students, StudentSectionsSections

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的回答。

答案 2 :(得分:1)

不需要连接,您只需使用set运算符:

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

只需将它们选为常量,即可显示“存在”和“不存在”。很容易得到所有缺席学生的名单。然后与现在的所有学生结合。通过获取完整的学生列表并使用除了操作员的失踪学生来找到当前学生。但除此之外,请确保您选择缺席的学生,因此他们会从您刚刚创建的名字旁边的所有学生名单中略微减去。