Si j'écris un sql:
select *
from a,b
where a.id=b.id(+)
and b.val="test"
et je veux que tous les enregistrements d'un enregistrement où correspondant dans b n'existent pas ou qu'il existe avec val = "test", s'agit-il de la requête correcte?
Vous utilisez beaucoup mieux la syntaxe ANSI
SELECT *
FROM a
LEFT OUTER JOIN b ON( a.id = b.id and
b.val = 'test' )
Vous pouvez faire la même chose en utilisant la syntaxe d'Oracle mais cela devient un peu hinkey
SELECT *
FROM a,
b
WHERE a.id = b.id(+)
AND b.val(+) = 'test'
Notez que dans les deux cas, j'ignore la table c
car vous ne spécifiez pas de condition de jointure. Et je suppose que vous ne voulez pas vraiment rejoindre A à B et générer ensuite un produit cartésien avec C.
Déplacez la condition dans la clause JOIN
et utilisez le modèle de jointure standard ANSI.
SELECT NameYourFields,...
FROM A
LEFT OUTER JOIN B
ON A.ID = B.ID
AND B.VAL = 'test'
INNER JOIN C
ON ...
SELECT * FROM abc a, xyz b
WHERE a.id = b.id
AND b.val = 'test'
Une jointure LEFT OUTER est l’une des opérations JOIN qui vous permet de spécifier une clause de jointure. Il préserve les lignes non appariées de la première table (à gauche) en les associant à une ligne NULL ayant la forme de la deuxième table (à droite).
Donc, vous pouvez faire comme suit:
SÉLECTIONNER
D'UN JOINT EXTERNE GAUCHE b ON a.id = b.id
- Notez que vous avez utilisé "test" entre guillemets non utilisés pour varchar dans SQL, vous devez utiliser "test" entre guillemets
AND b.val = 'test';