SQL加入Null问题

时间:2014-03-19 16:47:43

标签: sql sql-server join ssms

我在视图中使用了7个表。例如,我将使用这些作为我的表名(表中的字段对于这个主键,表示主键是表名+ ID)

表1。 教师

表2。 学生(例外 - 学生中包含所有其他6个表中的所有ID)

表3。 科学

表4。 数学

表5。 历史

表6。 德国

表7。 语言艺术

现在,3-7中的所有表格都与表2中的学生有关系。学生与老师有关系。

如果我的任何表格都有任何字段,我的视图目前有效。

,有些可以为空,如果我的表3-7中的任何一个完全为空,它也会起作用。

然而,我目前的问题是,如果我的老师没有分配给他们的学生,使表2-7为空,空等等....我的查询甚至不返回填写的教师信息...姓名,姓氏,出生日期等。

我该如何完成这个?

我尝试从所有表中做所有左连接,因为老师可以有空字段,我尝试从dbo.Teacher做内部连接作为教师内部加入dbo.Student在dbo.Student.TeacherID = Teacher.TeacherID但是那不起作用..我不知所措......

SELECT  Teacher.TeacherID ,
        Student.StudentID ,
        Science.ScienceID ,
        History.HistoryID ,
        Math.MathID ,
        German.GermanID ,
        LanguageArts.LanguageArtsID
FROM    dbo.Teacher AS Teacher
        LEFT OUTER JOIN dbo.Student 
            ON dbo.Student.TeacherID = Teacher.TeacherID
        LEFT OUTER JOIN dbo.Science AS Science 
            ON dbo.Student.ScienceID = Science.ScieneID
        LEFT OUTER JOIN dbo.Math AS Math 
            ON dbo.Student.MathID = Math.MathID
        LEFT OUTER JOIN dbo.History AS History 
            ON dboStudent.HistoryID = History.HistoryID
        LEFT OUTER JOIN dbo.German AS German 
            ON dbo.Student.GermanID = German.GermanID
        LEFT OUTER JOIN dbo.LanuageArts AS LanguageArts 
            ON dbo.Student.LanguageArtsID = LanguageArts.LanguageArtsID 

2 个答案:

答案 0 :(得分:0)

两条评论:

  • 你知道LEFT JOIN的使用吗?这个查询应该返回所有教师,甚至是没有学生的老师。
  

SELECT *        来自老师t LEFT JOIN学生s on s.teacher_id = t.id

(如果你想要所有学生,即使他们没有老师,也可以使用RIGHT JOIN)

  • 记住在SQL 1中== NULL和1!= NULL都是假的。因此,以下查询不会导致没有学生的教师或没有教师的学生。
SELECT *
     FROM teacher t, 
          student s
   WHERE s.teacher_id = t.id

答案 1 :(得分:0)

我想出了我的答案,在我的选择中,我使用的是dbo.Student.TeacherID,而不是dbo.Teacher.TeacherID,因此我的查询总是以null TeacherID值返回,因为我用一个查询检查我的视图这一个

    Select * from MyView Where TeacherID = 1;

这返回null,因为我的选择是拉动Student.TeacherID为null,所以我为dbo.Teacher.TeacherID交换了dbo.Student.TeacherID,现在它已经解决了。

这么好的时刻。感谢您的评论和回复。!

当我在我的OP中回顾时,我说我正在选择

SELECT  Teacher.TeacherID ,
    Student.StudentID , 

这在技术上是一个错字,但也是我的答案......