2010-09-09 7 views
24

J'ai une jointure sur deux tables définies comme une jointure externe gauche de sorte que tous les enregistrements soient renvoyés depuis la table de gauche même s'ils n'ont pas d'enregistrement dans la table de droite. Cependant, j'ai également besoin d'inclure une clause where sur un champ de la table de droite, mais ... Je veux toujours qu'une ligne de la table de gauche soit retournée pour chaque enregistrement dans le tableau de gauche même si le condition dans la clause where n'est pas remplie. Y-a-t'il une façon de le faire?Left Outer join et une clause supplémentaire where

Répondre

20

Oui, mettre la condition (appelé un prédicat) dans les conditions de jointure

Select [stuff] 
    From TableA a 
     Left Join TableB b 
      On b.Pk = a.Pk 
       -- [Put your condition here, like this] 
       And b.Column = somevalue 
10

Vous avez juste besoin de mettre le prédicat dans la condition JOIN. Le mettre dans la clause WHERE convertirait effectivement votre requête en une jointure interne.

Par exemple:

... 
From a 
Left Join b on a.id = b.id and b.condition = 'x' 
1
SELECT x.fieldA, y.fieldB 
FROM x 
LEFT OUTER JOIN (select fieldb, fieldc from Y where condition = some_condition) 
ON x.fieldc = y.fieldc 
0
select * 
    from table1 t1 
    left outer join table2 t2 on t1.id = t2.id 
where t1.some_field = nvl(t2.some_field, t1.some_field) 

UPD: errr ... non. de cette façon:

select * 
    from table1 t1 
    left outer join table2 t2 on t1.id = t2.id 
where some_required_value = nvl(t2.some_field, some_required_value) 

nvl est une syntaxe Oracle qui remplace le premier argument de seconde dans le cas où il est null (ce qui est courant pour les jointures externes). Vous pouvez utiliser ifnull ou coalesce pour d'autres bases de données.

Ainsi, vous comparez t2.some_field avec vos critères de recherche si elle a rencontré prédicat de jointure, mais si elle n'a pas, alors vous revenir Ramer de table1, parce que some_required_value par rapport à lui-même sera toujours vrai (à moins qu'il soit null, mais - null = null rendements null, ni true pas false

2

Vous pouvez utiliser

WHERE (right_table.column=value OR right_table.column IS NULL) 

Ceci renverra toutes les lignes du tableau 1 et le tableau 2, mais seulement WHE. re table 1 n'a pas de ligne correspondante dans le tableau 2 ou la ligne correspondante dans le tableau 2 correspond à vos critères.

+0

Cela ne fonctionne pas sur ECC6 –