2008-12-12 7 views
14

je vais avoir un problème avec la création d'une requête dans l'oracle qui ne marche pas semblent vouloir se joindre à des valeurs manquantesoracle gauche ne montre pas les jointures externes des valeurs NULL droit

la table que j'ai est ceci:

table myTable(refnum, contid, type) 

values are: 
1, 10, 90000 
2, 20, 90000 
3, 30, 90000 
4, 20, 10000 
5, 30, 10000 
6, 10, 20000 
7, 20, 20000 
8, 30, 20000 

une pause vers le bas des champs que je suis après est la suivante:

select a.refnum from myTable a where type = 90000 
select b.refnum from myTable b where type = 10000 and contid in (select contid from myTable where type = 90000) 
select c.refnum from myTable c where type = 20000 and contid in (select contid from myTable where type = 90000) 

le résultat de la requête que je suis après est la suivante:

a.refnum, b.refnum, c.refnum 

Je pensais que cela fonctionnerait:

select a.refnum, b.refnum, c.refnum 
from myTable a 
left outer join myTable b on (a.contid = b.contid) 
left outer join myTable c on (a.contid = c.contid) 
where a.id_tp_cd = 90000 
and b.id_tp_cd = 10000 
and c.id_tp_cd = 20000 

de sorte que les valeurs doivent être:

1, null, 6 
2, 4, 7 
3, 5, 8 

mais son seul retour:

2, 4, 7 
3, 5, 8 

je pensais quittai rejoint montrerait tout valeurs dans la gauche et créer une valeur nulle pour la droite.

aide :(

Répondre

24

Vous avez raison de dire que gauche se joint retournera nulls le droit où il n'y a pas de correspondance, mais vous n'êtes pas permettre à ces valeurs NULL à retourner lorsque vous ajoutez cette restriction à votre clause where :

and b.id_tp_cd = 10000 
and c.id_tp_cd = 20000 

Vous devriez être en mesure de mettre ces derniers dans le « sur la » clause de la jointure au lieu, de sorte que les lignes pertinentes à droite sont retournés

select a.refnum, b.refnum, c.refnum 
from myTable a 
left outer join myTable b on (a.contid = b.contid and b.id_tp_cd = 10000) 
left outer join myTable c on (a.contid = c.contid and c.id_tp_cd = 20000) 
where a.id_tp_cd = 90000 
2

. Ou en utilisant la syntaxe Oracle au lieu de ansi

select a.refnum, b.refnum, c.refnum 
from myTable a, mytable b, mytable c 
where a.contid=b.contid(+) 
and a.contid=c.contid(+) 
and a.type = 90000 
and b.type(+) = 10000 
and c.type(+) = 20000; 


REFNUM  REFNUM  REFNUM 
---------- ---------- ---------- 
    1      6 
    2   4   7 
    3   5   8