【问题标题】:SQL Left Outer Join acting like Inner JoinSQL Left Outer Join 的作用类似于 Inner Join
【发布时间】:2016-10-18 17:38:28
【问题描述】:

我正在尝试对两个表(嗯,一个内联视图和一个表)进行左外连接。 我想要发生的是列出所有毕业生(我知道有 3815 名 DISTINCT 毕业生)以及他们的任何注册(可能有 0 或 n 个注册)。我得到的只是有注册的毕业生名单(3649 名 DISTINCT 学生)。我不确定我没有从 grad 'view' 中获取所有行(我没有 create view privs 所以这是我的解决方法)。

这是我的代码:

    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 数据点。我也是工作中的贷款开发人员,所以我没有可以请任何人帮忙解决这个问题,而谷歌让我失望了。

谢谢!

【问题讨论】:

    标签: sql left-join outer-join toad


    【解决方案1】:

    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 之后评估,这将导致它从LEFT JOIN 中过滤掉NULL 记录。因此,在WHERE 子句中拥有LEFT JOIN 的右侧表格将有效地将OUTER JOIN 转换为INNER JOIN

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 2016-10-31
      • 2015-01-10
      • 1970-01-01
      • 2013-05-02
      • 2021-11-29
      • 2014-08-10
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多