【问题标题】:SQL Join Issue with Nulls空值的 SQL 连接问题
【发布时间】:2014-03-19 16:47:42
【问题描述】:

我在一个视图中使用了 7 个表。例如,我将使用这些作为我的表名(表中的字段与此无关,除了 PrimaryKey 是 tableName + 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 

【问题讨论】:

  • 如果您包含您的实际查询,人们会更容易提出具体的改进建议。
  • FULL OUTER JOIN, LEFT JOIN 并注意您的 where 子句标准。您可能需要将其移至联接,或者在它们上使用 or 语句的组合来处理 (Field = 'X' OR field is Null) 如果您只有 where Field = 'X' 您刚刚使外部联接无效,因为没有字段将有 X 如果没有匹配记录!

标签: sql sql-server join ssms


【解决方案1】:

两个cmets:

  • 您知道 LEFT JOIN 的用法吗?此查询应返回所有教师,即使没有学生。

选择 * FROM teacher t LEFT JOIN student 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

【讨论】:

    【解决方案2】:

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

        Select * from MyView Where TeacherID = 1;
    

    这返回了 null,因为我的选择正在拉取为 null 的 Student.TeacherID,因此我将 dbo.Student.TeacherID 换成了 dbo.Teacher.TeacherID,现在已解决。

    这样的时刻。感谢 cmets 和回复。!

    当我阅读我的 OP 时,我说我正在选择

    SELECT  Teacher.TeacherID ,
        Student.StudentID , 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      相关资源
      最近更新 更多