2017-06-01 4 views
-1

合体を使用して結果を生成しましたが、ヌル値で重複する行があります。以下のように合体でヌル値を避ける

サンプル表:NULL値の重複行がどこから来た

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

こんにちはホーガン、上記の表を参考にしてください。 – GoodToBe1990

+0

なぜ3つの異なるテーブルがありますか?すべてのクラスを同じテーブルに入れます。 – 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 

結果 "ちょうど私が合体使って、null値を与える避けることができる方法を知りたいの?" に答える

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の場合は、NULLを返します。これは、問題の一部です。

のでSelect Id, Name, Coalesce (chinesetable.grade, englishtable.grade, mathstable.grade) ...はまだchinesetable.gradeのすべての場合、あなたにNULLグレードを与えenglishtable.grade、およびmathstable.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

こんにちはDavidさん、上記のように編集しました。 db内のMusic Tableにグレードがないため、合体後の結果でNullである必要がありますが、他のサブジェクトがNull値を持つ重複した行をSubjectテーブルに残している理由は不明です。そして、私は "Grade IS NOT NULL"を使用することはできません.NULLは正常でなければならないMusic行を削除するからです。 – GoodToBe1990

+1

実際に試した質問を投稿してください。質問にはエラーが含まれているため、 (例:エラー: 'student.subjectId = Chinese.subjectId'ではなく' student.id = Chinese.subjectId'に参加し、他のテーブルでも同じで、一度に 'Enlgish'として' English'をスペルミスします)これらのエラーを修正すると、表示されている重複した行を生成せずにクエリが動作するように見えます。 –

関連する問題