2017-06-01 65 views
-1

我已經使用合併來產生結果,但獲得了具有空值的重複行。避免合併中的空值

示例表如下:

Table - Student    
ID Student Subject id Subject Grade id 
100 Peter 200   Chinese 201 
101 Mary 300   English 302 
102 Sam  400   Maths  403 
103 John 900   Music 

Chinese Table  
Subject id Grade id Grade 
200   201   Good 
200   202   Average 
200   203   Poor 

English Table  
Subject id Grade id Grade 
300   301   Good 
300   302   Average 
300   303   Poor 

Maths Table  
Subject id Grade id Grade 
400   401   Good 
400   402   Average 
400   403   Poor 

Select Id, Name, 
Coalesce (chinese.grade, english.grade, maths.grade) 
from Student 
Left join Chinese On student.id = Chinese.subjectId AND student.gradeId = Chinese.gradeId 
Left join English On student.id = English.subjectId AND student.gradeId = Enlgish.gradeId 
Left join Maths On student.id = Maths.subjectId AND student.gradeId = Maths.gradeId 

Result 
ID Student Subject  Grade 
100 Peter Chinese   Good 
100 Peter Chinese   NULL 
101 Mary English   Average 
101 Mary English   NULL 
102 Sam  Maths   Poor 
102 Sam  Maths   NULL 
103 John Music   NULL 

我不知道在哪裏Null值的重複行了的,只是想知道我怎麼能避免使用合併給空值?

+1

你應該向我們展示完整的select語句。有點難以告訴你什麼是錯誤的,當你不顯示損壞的部分。 – Hogan

+0

嗨Hogan,如上所述的編輯表,你可以請檢查。 – GoodToBe1990

+0

爲什麼你有三張不同的桌子?將所有類放在同一個表中。 – jarlh

回答

0

使用:「只是想知道我怎麼能避免使用合併給空值」

select s.id,s.name,s.[subject], 
coalesce(coalesce(coalesce(c.grade,e.grade,c.grade),e.grade, coalesce(c.grade,e.grade,c.grade)),m.grade,coalesce(coalesce(c.grade,e.grade,c.grade),e.grade, coalesce(c.grade,e.grade,c.grade))) as grade 
from student s 
left join chinese c on s.subjectid = c.subjectid and c.gradeid = s.gradeid 
left join english e on e.subjectid = s.subjectid and e.gradeid = s.gradeid 
left join maths m on m.subjectid = s.subjectid and m.gradeid = s.gradeid 

結果

id--name----subject--grade 

100 Peter Chinese Good 
101 Mary English Average 
102 Sam  Maths Poor 
103 John Music NULL 
+0

這是不合適的,因爲它將刪除結果中的「音樂」行,其值NULL應該是正常的。我只想刪除結果中有等級的NULL值(即中文,英文,數學) – GoodToBe1990

+0

更新了答案。 –

0

接聽這個問題的一部分而已,因爲重複記錄的來源需要比提供了更多信息:

COALESCE在其參數列表返回第一個非空值,或者如果NULL所有參數都NULL

所以Select Id, Name, Coalesce (chinesetable.grade, englishtable.grade, mathstable.grade) ...仍然會給你一個NULL級,如果所有的chinesetable.gradeenglishtable.grademathstable.gradeNULL。你需要決定你想在這種情況下做什麼。你既可以跳過這些行:

Select * From 
    (Select Id, Name, Coalesce (chinesetable.grade, englishtable.grade, mathstable.grade) As Grade from Student where id = id...) As grades_with_nulls 
    Where Grade Is Not Null; 

還是要Coalesce提供一個默認值作爲最後一個參數:

Select Id, Name, Coalesce (chinesetable.grade, englishtable.grade, mathstable.grade, 'None') from Student where id = id... 
+0

嗨大衛,編輯表如上。知道該主題音樂在合併後的結果中應爲Null,因爲數據庫中的音樂表中沒有評分,但不確定爲什麼其他主題在主題表中不爲空的情況下仍然會使用NULL值重複行。我不能使用「Where IS NOT NULL」,因爲它會刪除空行應該是正常的音樂行。 – GoodToBe1990

+1

請發佈一個您實際已經嘗試過的查詢。您的問題中的查詢包含錯誤,並且不能產生結果(例如錯誤:加入'student.id = Chinese.subjectId'而不是'student.subjectId = Chinese.subjectId',其他表格相同,在一次使用中拼寫爲'Enlgish'的英文拼寫錯誤)如果你修正了這些錯誤,那麼查詢看起來應該不會產生你所看到的重複行。 –