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?
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
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'
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.
SELECT x.fieldA, y.fieldB
FROM x
LEFT OUTER JOIN (select fieldb, fieldc from Y where condition = some_condition)
ON x.fieldc = y.fieldc
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
.