2014-11-03 55 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