2014-11-03 60 views
0

我正在编写一个查询以从两个表中检索数据。该表有这样的数据:具有多个SQL时出现空值

表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。

+0

什么是你想去做? – DavidG 2014-11-03 10:53:25

+0

你想做什么? – 2014-11-03 10:53:31

+0

@DavidG会将“AssignmentSubmitted”设置为零,并studentid 1.现在它返回一个studentid 2. – user2395176 2014-11-03 10:55:57

回答

1

您不需要使用CASE语句。相反,你可以使用ISNULL替代NULL0

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

如果我还有一个状态'2',那么我不能继续使用ISNULL(Assignment.AssignmentStatus,0)AS AssignmentStatus.Can你可以看看 – user2395176 2014-11-03 11:06:09

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()实际的逻辑比较复杂。

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

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