具有多个的SQL时为null

时间:2014-11-03 10:50:29

标签: sql sql-server sql-server-2008

我正在编写一个查询来检索两个表中的数据。表格的数据如下:

表1:

StudentId Studentname
---------------------
1         test
2         test1

表2:

StudentId Assignmentstatus date
--------------------------------------
1         0                 01/01/2014
1         1                 02/01/2014

状态1表示已提交作业,2表示经过验证后返回。

加入表格

select 
    student.StudentId, student.Studentname,
    case (select top 1 Assignmentstatus 
          from Assignment 
          where Assignment.StudentId = student.StudentId 
          order by date desc) when 0 then 1 else 0 end as AssignmentSubmitted 
from 
    student 
left join 
    Assignment on Assignment.studentId = Student.StudentId.

它也为StudentId 2返回1。

4 个答案:

答案 0 :(得分:2)

首先,这是您的查询:

select s.StudentId, s.Studentname,
       (case (select top 1 Assignmentstatus
              from Assignment a2
              where a2.StudentId = s.StudentId
              order by date desc
             )
            when 0 then 1 else 0
        end) as AssignmentSubmitted 
from student s left join
     Assignment a 
     on a.studentId = s.StudentId;

分配的外部联接不是必需的,因此您可能真的需要:

select s.StudentId, s.Studentname,
       (case (select top 1 Assignmentstatus
              from Assignment a2
              where a2.StudentId = s.StudentId
              order by date desc
             )
            when 0 then 1 else 0
        end) as AssignmentSubmitted 
from student s;

您的内部联接正在将给定学生AssignmentStatusAssignment的最新值与0进行比较。因为两个学生都不是最近的状态0.在一个案例中,它是" 1"。在另一个" Null"中,它总是返回0.一个SQL小提琴是here

据推测,您希望状态(如果可用)。我倾向于使用outer apply编写此查询:

select s.StudentId, s.Studentname, coalesce(a.Assignmentstatus, 0) as Assignmentsubmitted
from student s outer apply
     (select top 1 Assignmentstatus
      from Assignment a2
      where a2.StudentId = s.StudentId
      order by date desc
     ) a;

如果实际逻辑更复杂,您可以使用case代替coalesce()

答案 1 :(得分:1)

您不需要使用CASE声明。相反,您可以使用ISNULL替换NULL 0

SELECT Student.StudentId,
       Student.Studentname,
       ISNULL(Assignment.AssignmentStatus, 0) AS AssignmentStatus
FROM Student 
LEFT JOIN Assignment
    ON Assignment.StudentId = Student.StudentId

答案 2 :(得分:0)

您似乎想要向任何学生提供最新的Assignmentstatus,不是吗?

那是怎么回事?

select t1.Studentname, 
       t2.Assignmentstatus, 
       t2.date 
  from table1 t1, table2 t2
 where t1.StudentId = t2.StudentId 
   and t2.date = (Select max(date) from table2 where StudentId = t1.StudentId)

http://www.sqlfiddle.com/#!2/5af1a1/1

答案 3 :(得分:0)

假设AssignmentStatus只会增加(例如,在返回后不会再回到'提交'),那么你可以使用类似的东西:

SELECT s.StudentId
     , s.Studentname
     , ISNULL(MAX(a.AssignmentStatus), 0) AS AssignmentStatus
FROM Student s
     LEFT JOIN Assignment a ON a.StudentId = s.StudentId
group by s.StudentId, s.Studentname