web-dev-qa-db-fra.com

Jointure externe gauche et clause where supplémentaire

J'ai une jointure sur deux tables définie comme étant une jointure externe gauche afin que tous les enregistrements soient renvoyés à partir de la table de gauche même s'ils ne possèdent pas d'enregistrement dans la table de droite. Cependant, je dois également inclure une clause where dans un champ de la table de droite, mais ... Je souhaite tout de même qu'une ligne de la table de gauche soit renvoyée pour chaque enregistrement de la table de gauche, même si condition dans la clause where n'est pas remplie. Y-a-t'il une façon de le faire?

27
atamata

Oui, mettez la condition (appelée 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
20
Charles Bretana

Il vous suffit de placer le prédicat dans la condition JOIN. Le placer dans la clause WHERE convertirait efficacement votre requête en jointure interne.

Par exemple:

...
From a
Left Join b on a.id = b.id and b.condition = 'x'
10
Martin Smith

Vous pouvez utiliser 

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

Toutes les lignes de la table 1 et de la table 2 seront renvoyées, mais uniquement si la table 1 n'a pas de ligne correspondante dans la table 2 ou si la ligne correspondante dans la table 2 correspond à vos critères.

2
Kjetil Watnedal
SELECT x.fieldA, y.fieldB
FROM x
LEFT OUTER JOIN (select fieldb, fieldc from Y where condition = some_condition)
ON x.fieldc = y.fieldc
1
egrunin
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 ... no. par ici:

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 par second si elle est null (ce qui est commun pour les jointures externes). Vous pouvez utiliser ifnull ou coalesce pour d'autres bases de données. 

Ainsi, vous comparez t2.some_field à vos critères de recherche si le prédicat join est atteint, mais si ce n'est pas le cas, vous renvoyez simplement la ligne à partir de table1, car some_required_value par rapport à lui-même sera toujours vrai (à moins que ce soit null, cependant - null = null renvoie null , ni true pas false.

0
be here now