SQL 左外连接表现得像内连接

SQL Left Outer Join acting like Inner Join

我正在尝试对两个 table 进行左外连接(好吧,一个内联视图和一个 table)。 我想要发生的是列出所有毕业生(我知道有 3815 个不同的毕业生)及其任何注册(可能有 0 或 n 注册)。我得到的只是一份已注册的毕业生名单(3649 名不同的学生)。我不确定没有从 grad 'view' 获取所有行我哪里出错了(我没有创建视图权限,所以这是我的解决方法)。

这是我的代码:

    SELECT C.*, D.FREEZE_EVENT, D.ACADEMIC_PERIOD, D.CAMPUS, D.COLLEGE, D.COLLEGE_DESC,D.MAJOR, D.MAJOR_DESC , D.STUDENT_RATE
FROM 
(SELECT A.STUDENT_LEVEL_DESC, A.CAMPUS, A.CAMPUS_DESC, A.COLLEGE, A.COLLEGE_DESC, A.MAJOR_DESC, A.MAJOR, A.DEGREE_DESC, A.PERSON_UID, A.ID, A.NAME, 
A.OUTCOME_GRADUATION_DATE, A.STATUS, A.GRAD_YEAR, A.TRAINING_LOCATION, B.CITIZENSHIP_TYPE
FROM ACAD_OUTOCME A, PERSON_DETAIL B
WHERE A.STUDENT_LEVEL IN ('02','03') AND A.GRAD_YEAR = '2015' AND A.FREEZE_EVENT = '10TH_SEP2016' AND B.FREEZE_EVENT = '10TH_SEP2016'
AND A.ID = B.ID) C 
LEFT OUTER JOIN ACAD_STUDY D ON
C.CAMPUS = D.CAMPUS 
AND C.COLLEGE = D.COLLEGE 
AND C.MAJOR = D.MAJOR
AND C.PERSON_UID = D.PERSON_UID
WHERE D.FREEZE_EVENT = '10TH_SEP2016' 
ORDER BY C.NAME

有什么建议吗?我正在使用 Toad 数据点。我也是工作中的贷款开发商,所以我找不到任何人可以帮忙解决这个问题,google 让我失望了。

谢谢!

将您的 WHERE 条件移动到 ON 条件:

Select  C.*
      , D.FREEZE_EVENT
      , D.ACADEMIC_PERIOD
      , D.CAMPUS
      , D.COLLEGE
      , D.COLLEGE_DESC
      , D.MAJOR
      , D.MAJOR_DESC
      , D.STUDENT_RATE
From    (Select A.STUDENT_LEVEL_DESC
              , A.CAMPUS
              , A.CAMPUS_DESC
              , A.COLLEGE
              , A.COLLEGE_DESC
              , A.MAJOR_DESC
              , A.MAJOR
              , A.DEGREE_DESC
              , A.PERSON_UID
              , A.ID
              , A.NAME
              , A.OUTCOME_GRADUATION_DATE
              , A.STATUS
              , A.GRAD_YEAR
              , A.TRAINING_LOCATION
              , B.CITIZENSHIP_TYPE
         From   ACAD_OUTOCME A
         Join   PERSON_DETAIL B  On   A.ID = B.ID
         Where  A.STUDENT_LEVEL In ('02', '03')
                And A.GRAD_YEAR = '2015'
                And A.FREEZE_EVENT = '10TH_SEP2016'
                And B.FREEZE_EVENT = '10TH_SEP2016'
        ) C
Left Outer Join ACAD_STUDY D
        On C.CAMPUS = D.CAMPUS
           And C.COLLEGE = D.COLLEGE
           And C.MAJOR = D.MAJOR
           And C.PERSON_UID = D.PERSON_UID
           And D.FREEZE_EVENT = '10TH_SEP2016'
Order By C.NAME;

WHERE 子句在 OUTER JOIN 之后计算 ,这将导致它从 [=] 中过滤掉 NULL 条记录16=]。因此,在 WHERE 子句中使用 LEFT JOIN 的右侧 table 将有效地将 OUTER JOIN 转换为 INNER JOIN.