2016-10-18 1 views
0

J'essaye de faire une jointure externe gauche sur deux tables (bien, une vue en ligne et une table). Ce que je veux arriver est de lister tous les diplômés (je sais qu'il y a 3815 DISTINCT Grads) avec n'importe laquelle de leurs inscriptions (il pourrait y avoir 0 ou n inscriptions). Ce que je reçois est seulement une liste des diplômés qui ont des inscriptions (3649 étudiants DISTINCT). Je ne suis pas sûr d'où je vais me tromper si je n'obtiens pas toutes les lignes de la vue 'grad' (je n'ai pas créé de vue privs, donc c'est ma solution de contournement).SQL Left Join externe agissant comme Inner Join

Ceci est mon code:

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 

Toutes les suggestions? J'utilise Toad Data Point. Je suis aussi le développeur de prêts au travail, donc je n'ai personne à qui demander de l'aide, et google m'a échoué.

Merci!

Répondre

2

Déplacez votre état WHERE à la condition 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; 

La clause WHERE est évaluée après la OUTER JOIN, qui provoquerait à filtrer les NULL enregistrements de la LEFT JOIN. Donc, avoir la table de droite d'un LEFT JOIN dans la clause WHERE va effectivement transformer le OUTER JOIN en INNER JOIN.