web-dev-qa-db-fra.com

Comment utiliser Oracle jointure externe avec un filtre où clause

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?

8
Victor

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.

15
Justin Cave

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 ...
1
Declan_K
SELECT * FROM abc a, xyz b
 WHERE a.id = b.id
   AND b.val = 'test'
1
santosh

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';

0
Gourabp